メニュー項目をユーザが選択した場合、そのメニューを持っている Window へ メッセージが送られ、その Window Procedure が呼び出されます。 つまり、いまの場合は WndProc Exampleで示した関数が呼び出されます。 この時、uMsg には WM_COMMAND という値が設定されており、 wParam に、選択されたメニュー項目に対応する ID と Notification Code (メニューの場合は 0)が設定されています。 例えば、前回示したメニューの例 で、ユーザが "File"-"Exit" を選ぶと、wParam の LOWORD には ID_FILE_EXIT が設定されて、WndProc() が呼び出されます。
具体的に前の WndProc() の例 を、 WM_PAINT の処理も加えて書き換えて みましょう。Resource File にある ID と共通の ID が必要なので、 resource.h を include してあります。
#define STRICT
#include <windows.h>
#include "resource.h"
void OnPaint( HDC hdc );
LRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
WORD wNotifyCode;
WORD wID;
HDC hdc;
PAINTSTRUCT ps;
switch( uMsg )
{
case WM_COMMAND:
wNotifyCode = HIWORD( wParam );
wID = LOWORD( wParam );
switch( wID )
{
case ID_FILE_EXIT:
DestroyWindow( hwnd );
break;
default:
MessageBox( NULL, "Sorry. Not implemented yet.", "My Program", MB_OK );
break;
}
break;
case WM_DESTROY:
PostQuitMessage( 0 );
break;
case WM_PAINT:
hdc = BeginPaint( hwnd, &ps );
OnPaint( hdc );
EndPaint( hwnd, &ps );
break;
default:
return( DefWindowProc( hwnd, uMsg, wParam, lParam ) );
}
return 0;
}
これで、メニュー "File" - "Exit" を選ぶと、プログラムが終了するように
なりました。