アプリケーションのひな型

今回は、前回のGENERICプログラムにメニューやファイルオープンのコモンダイアログをつけます。 こうすると、ほとんどのアプリケーションで使える「ひな型」ができあがります。

hinagataプログラム

ソース

メニューをつけるには、まずメニューの階層構造を*.rcファイルに記述します。 これは、テキストエディタの作成のときにも出てきたので分かると思います。

つぎに、メインウインドウにメニューを表示します。 これはRegisterClass()時に、
wc.lpszMenuName = "HinagataMenu";
のようにメニュー名を指定する方法が簡単です。

あとは、メニューを選択された時の動作を WM_COMMAND への応答として記述するだけです。 これも、テキストエディタの作成のときに出てきたのと同じです。

アクセラレータもつけたほうが良いでしょう。F1キーでヘルプを呼び出せるようにしてます。

メニューとコントロールを両方使う場合

というか、メニューバーつきのウィンドウをサイズ固定にする場合の注意事項ですが、 メニューバーは折り返して複数行になることがあります。 (しかもメニューのフォントサイズはアプリの実行中に変更できます。) これに正しく対応する必要があります。 ソース

文字列などの直接描画

通常のウィンドウを使う場合、文字列の描画のためにわざわざコントロールを貼ったりせずに、 WM_PAINTへの応答などで直接ウィンドウに描画することが多くなります。 描画方法は、簡易グラフィック(1)(2)で説明したのと同じですが、 このとき色を適切に指定しないと、妙なことになります。

(1)ウィンドウの背景色にWHITE_BLUSH等を指定した場合

RegisterClass()時にウィンドウの背景色に
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//白
とか
wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);//ライトグレー
とか絶対色を指定した場合は、文字列などの描画にも
SetTextColor(hdc, RGB(0,0,0)), SetBkColor(hdc, RGB(255,255,255));//文字は黒 背景は白
のように絶対色を指定します。この方法は簡単に作者の望み通りの表現が得られますが、 それが全てのユーザーにとって使いやすいとは限らないのが問題です。

(2)ウィンドウの背景色にCOLOR_WINDOW等を指定した場合

RegisterClass()時にウィンドウの背景色に
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //ウィンドウの背景色(デフォルトは白)
とか
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);//ボタン表面の色(デフォルトはライトグレー)
とか、ユーザーが「画面のプロパティ」で設定可能な色を指定した場合は、文字列などの描画にも、
	SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
	SetBkColor(hdc,GetSysColor(COLOR_WINDOW));
とか、
	SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT));
	SetBkColor(hdc,GetSysColor(COLOR_BTNFACE));
のように指定します。ここを間違えると、ユーザーが「ハイコントラスト黒」を選んだ時など、 文字が読めなくなったりします。 (COLOR_BTNFACEとCOLOR_WINDOWTEXTのような変則的な組合せもまずいと言えます。 ユーザーが全部手動で色指定してた場合に読めないかもしれません。 ので、必ずペアになった色同志を組み合わせます。)

前のページ

次のページ

一つ上のページに戻る