Windowsプログラムでは、ダイアログボックスやアイコン、メニューバーのような
プログラム以外で実行ファイル内に埋め込まれているものを「リソース」と呼ぶ。
ダイアログボックスを使って操作パネルを作っていく。
ダイアログに限らず、リソースを作る時はこの手順。
プロジェクト名を右クリックして「追加」⇒「リソース」。
「Dialog」を選んで「新規作成」。
ツールボックスから、使いたいパーツを選んで並べていく。
右下のプロパティウィンドウには、今編集中のパーツの詳細が表示される。
IDはあとから重要になってくるので、分かりやすい名前にしておいたほうが良い。
今回はラジオボタンのIDは上から順に
「IDC_RADIO_UP」「IDC_RADIO_DOWN」「IDC_RADIO_CHANGE」とする。
作ったダイアログを表示するプログラムを書いていく。
ちなみに、ダイアログボックスには2種類ある。
ひとつは、ダイアログを閉じるまで他の操作ができないモーダルダイアログボックス(ファイルを開くときのダイアログとか)。
もうひとつは、ダイアログ表示中も他の操作ができるモードレスダイアログ(置換機能とか)。
今回表示するのは、後者のモードレスの方になる。
ダイアログもひとつのウィンドウなのでプロシージャ関数が必要になる。
(例)
BOOL CALLBACK DialogProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
}
return FALSE;
}
ウィンドウプロシージャと大体同じつくりだが、戻り値の方がBOOL型になっていて、何か処理をしたらTRUE、何もしなかったらFALSEを返すルールになっている。
なお、msgにはメッセージが入ってくる。代表的なメッセージだと・・・
WM_INITDIALOG・・・ダイアログが表示された(最初にやりたいことを書く)
WM_COMMAND・・・ダイアログ上のパーツや、メニューの項目に触れた(LOWORD(wp)に触ったパーツのIDが入っている)
などがある。
ダイアログや、その中の各パーツのIDは「resouce.h」で定義されているので、それらを使うソースで「resouce.h」をインクルードする必要がある。
で、表示するにはCreateDialog関数を使う。
(例)
HWND hDlg = CreateDialog(インスタンスハンドル, MAKEINTRESOURCE(ダイアログのID), 親ウィンドウのハンドル, (DLGPROC)プロシージャ名);
各コントロールにはハンドルがある。
コントロールに対して何かしたい場合は、そのハンドルが必要になる。
ダイアログ上のコントロールのハンドルは
GetDlgItem(ダイアログのハンドル, コントロールのID)
で取得できる。
ラジオボタンにチェックを付けたり、コンボボックスに文字列をセットしたり……
こちらからコントロールに対して何かしたい場合は、コントロールに対してメッセージを送る。
SendMessage(コントロールのハンドル, メッセージ, 情報A, 情報B)
代表的なところでは次のような感じ。
コントロールがクリックされたり選択されたりすると、ダイアログプロシージャが呼ばれる。
この時、メッセージは「WM_COMMAND」、LOWORD(wp)に「コントロールのID」が入っている。
コンボボックスはSendMessageで「CB_GETCURSEL」メッセージを送ると、戻り値が現在選択してる番号になる。
(情報A,Bは0でOK。戻り値はint型にキャストする)