アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

1-3-11. WM_COMMAND

 ApHelloのプロシージャの、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らいし処理です。

ページ移動