さて、第5日目では、ダイアログボックスの作り方をマスターします。コツは、まずソースにダイアログボックス部分を書いてしまうことです。(まだ、リソースをいじらない)
どの、タイミングでダイアログボックスを出すかを決めます。通常は、メニューの「オプション」などから出しますね。
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
int id;
switch (msg) {
case WM_COMMAND:
switch (LOWORD(wp)) {
case IDM_END:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
case IDM_DLG:
DialogBox(hInst, "MYDLG", hWnd, (DLGPROC)MyDlgProc);
break;
}
break;
...略...
メインウィンドウのプロシージャで、ダイアログボックスを出すタイミングの時(ここではメニューのIDM_DLGが選択された時)に、先にDialogBox(...);を書いてしまいます。ダイアログボックス、を作る時にはそれ専用のプロシージャも必要ですね。上の例では、MyDlgProcです。
次にMyDlgProcを書いてしまいます。
...略...
// ダイアログボックスのプロシージャのプロトタイプ宣言
BOOL CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM);
...略...
BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_COMMAND:
switch (LOWORD(wp)) {
case IDOK:
EndDialog(hDlg, IDOK);
return TRUE;
}
return FALSE;
}
return FALSE;
}
これで、デフォルトのOKボタンを押すと、ダイアログボックスが閉じるようになります。
この後、ダイアログボックスのリソースを作ります。あれこれ、貼り付けないでOKボタンとキャンセルボタンしかないシンプルなものを作って試運転です。これで、ダイアログボックスが思い通りに出現して、OKボタンを押したら閉じてくれれば成功です。最初から、あれこれ、複雑なダイアログボックスを作ってはいけません。うまく動かない時、にバグを捜すのが大変です。このシンプルなダイアログボックスが成功したら、これに一つずつコントロールを加えていきます。そして、プロシージャ部分を書いていきます。決して、一気にあれこれ書いてはいけません。
もっともだめなパターンは、複雑なプログラムをコピーしてきて、これをコンパイルして「アリャーー、だめだ!!」となることです。これでは、どこがどう間違ったのか皆目検討がつきません。また、サンプルのプログラムをコピーして、これがうまくコンパイルできたので、理解したつもりになってもいけません。
あくまでも、自分でひとつひとつ確かめながら先に進むことです。