前回 Dialog Template を書いたので、 ここでは、このメッセージを処理する関数を用意し、名前を MyCmndProcとしましょう。書き方は、 以前にやった Window Procedure と、ほぼ同じです。
#define STRICT #include <windows.h> #include "resource.h" BOOL CALLBACK MyCmndProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { WORD wNotifyCode; WORD wID; switch( uMsg ) { case WM_COMMAND: wNotifyCode = HIWORD( wParam ); wID = LOWORD( wParam ); if( (wID == IDOK) || (wID == IDCANCEL) ) { EndDialog( hDlg, (int)wID ); return TRUE; } break; default: break; } return FALSE; }EndDialog()で Dialog Window が破棄されます。この時、親 Window へ 戻り値を渡すことができます。ここでは、wID をそのまま渡して います。
これで一応 Dialog Box を表示する準備ができたので、Main Menu の "File"-"Command"(すなわち、ID_FILE_CMND を伴う WM_COMMAND メッセージ)に対して、この Dialog Box を表示するように します。そのためには、前の WndProc の WM_COMMAND メッセージの処理部分を
BOOL CALLBACK MyCmndProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); void OnPaint( HDC hdc ); LRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { WORD wNotifyCode; WORD wID; HDC hdc; PAINTSTRUCT ps; HINSTANCE hInst; switch( uMsg ) { case WM_COMMAND: wNotifyCode = HIWORD( wParam ); wID = LOWORD( wParam ); switch( wID ) { case ID_FILE_EXIT: DestroyWindow( hwnd ); break; case ID_FILE_CMND: hInst = (HINSTANCE)GetWindowLong( hwnd, GWL_HINSTANCE ); DialogBox( hInst, "MyCmndDlg", hwnd, (DLGPROC)MyCmndProc ); break; default: MessageBox( NULL, "Sorry. Not implemented yet.", "My Program", MB_OK ); break; } break; :とします。この時、DialogBox() の戻り値は、EndDialog() で 設定した戻り値になっているので、それに応じて処理を変えることができますが、 この例では何もしていません。