|
|
|
1-3-11. WM_COMMANDApHelloのプロシージャの、WM_COMMAND メッセージの処理を説明します。LRESULT CALLBACK ApHelloProc(HWND hWnd,UINT uMsg
,WPARAM wParam,LPARAM lParam)
{
static HFONT hFont;
static UINT idFormat = IDM_CENTER;
static LPSTR pHello = "Hello World.";
switch (uMsg)
{
:
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
//
// [ファイル(F)]のメニュー項目
//
case IDM_ABOUT:
{
HINSTANCE hInst;
hInst = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
DialogBox(hInst,"ABOUTDLG",hWnd,(DLGPROC)AboutProc);
break;
}
case IDM_EXIT: // ApHelloの終了
PostMessage(hWnd,WM_CLOSE,0,0);
break;
//
// [表示(V)]のメニュー項目
//
case IDM_LEFT: // 左側に表示
case IDM_CENTER: // 中央に表示
case IDM_RIGHT: // 右側に表示
{
HMENU hMenu;
UINT id;
id = LOWORD(wParam);
hMenu = GetMenu(hWnd);
if (hMenu) hMenu = GetSubMenu(hMenu,1);
if (hMenu)
{
CheckMenuItem(hMenu,idFormat
,MF_BYCOMMAND|MF_UNCHECKED);
CheckMenuItem(hMenu,id,MF_BYCOMMAND|MF_CHECKED);
}
idFormat = id;
InvalidateRect(hWnd,NULL,TRUE);
UpdateWindow(hWnd);
break;
}
default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
return 0;
}
:
WM_COMMAND メッセージは、メニューを実行した場合や、アクセラレータキーを押した場合などに発生します。wParam 変数の下16ビットに、IDM_XXX のコマンドコードがあるため、switch 文の中で、さらに switch 文を使用しています。IDM_XXX は、ApHello.h に定義しています。リソースのメニューに対応した並びになっていると思います。
IDM_ABOUT では、ファイルメニューの「バージョン情報」コマンドを実行したときの処理を行ないます。ここでは、DialogBox 関数で、ABOUTDLG ダイアログボックスを表示します。これはリソースが操作対象になりますので、詳しくは次項のリソースとダイアログボックスで説明します。 IDM_EXIT では、ファイルメニューの「ApHelloの終了」コマンドを実行したときの処理を行ないます。ここでは、PostMessage 関数で、WM_CLOSE メッセージをポストします。WM_CLOSE メッセージは、WM_DESTROY を派生し、それがさらに、WM_QUIT を派生し、その指令を受けてアプリケーションが終了します。 IDM_LEFT,IDM_CENTER,IDM_RIGHT は表示メニューの「左側に表示、中央に表示、右側に表示」に対する処理を実行します。ここでは、表示メニューのサブメニューにチェクマークを付け替えることと、idFormat 変数を変更するだけです。その後に、InvalidateRect と、UpdateWindow 関数をコールしていますが、この2つで再描画を行なっています。InvalidateRect 関数は、クライアントエリアを無効(更新されたというマーク)にします。そして、UpdateWindow 関数をコールして、WM_PAINT メッセージを発生します。実際の表示は、WM_PAINT メッセージで行ないます。いかにもWindowsらいし処理です。
|