今回は、ダイアログボックスにメニューを付けます。メニューから、アプリケーションを終了できるようにします。
テキストの表示 - インコのWindowsSDK で作成したソースを修正します。
C言語 ソースファイル
WM_COMMAND
WM_COMMANDメッセージは、メニューを選択したときなど、発生するメッセージです。
メッセージとは、ユーザーがキーを押した、マウスを移動した、メニューを実行したなどの動作をやり取りするものでした。
1、メニューを選択した際に、WM_COMMANDメッセージがきます。
このとき、ウィンドウプロシージャ(メッセージを処理する関数)の3番目の引数(ここではwParam)のうち、下位16ビットは、リソースID(メニューを選択した場合は、メニューのリソースID)
なので、これを処理します。
32ビットから下位16ビットを取り出すには、LOWORD()を使用します。
WORD LOWORD(
DWORD dwValue
);
なお、上位16ビットを取り出す場合は、HIWORD()を使用します。
WORD HIWORD(
DWORD dwValue
);
2.メニューで終了を選択した場合、リソースIDがIDM_EXITになります。 このとき、ダイアログボックスを閉じる関数EndDialog()を実行します。
リソースファイル
メニュー[MENU]
「Windows デスクトップ アプリケーション」を選択してプロジェクトを作成した場合は、 メニューがリソースファイルに初めから追加されております。
ソースコードを直接手入力する場合
コントロールID MENU
BEGIN
POPUP "メニュー1(&*)"
BEGIN
MENUITEM "項目1(&*)", ****
MENUITEM "項目2(&*)", ****
END
POPUP "メニュー2(&*)"
BEGIN
MENUITEM "項目1(&*)", ****
MENUITEM "項目2(&*)", ****
END
END
親メニューはPOPUP、子メニューはMENUITEMで表記します。
子メニューの始めにBEGINを入れ、と最後にENDを入れます。
Visual Studioのリソース ビューから追加する場合
Visual Studio Expressでは、この方法は利用できません。
Visual Studio Express 以外の場合は、Visual Studioからメニューを追加できます。
右上のウインドウから「リソース ビュー」のシートをクリック。
リソースファイルを右クリックして、メニューを開き、「リソースの追加(A)...」を選択してください。
「リソースの追加」ダイアログが開くので、リソースの種類(T):「Menu」を選択してから、 「新規作成」ボタンをクリックしてください。
プレビュー画面の「ここへ入力」となっているところを、1回クリックすると、メニュー名を入力できるようになるので、
メニュー名を入力します。ここでは「ファイル(&F)」と入力します。
メニューの項目名も入力できるので入力します。ここでは「アプリケーションの終了(&X)」と入力します。
ここで(&F)」と入力すると、表示が下記のように下線付きになり、Altキーを押しながらFキーを押すと、直接選択できるメニューを作成できます。
ダイアログボックスにメニュー[MENU]を追加
ソースコードを直接手入力する場合
MENU id
| id | コントロールID |
Visual Studioのリソース ビューから追加する場合
メニューをVisual Studioのリソース ビューで追加すれば、ダイアログボックスの「プロパティ」ウインドウで、Menuを選択できるようになります。
ソースコードの入力
ソースコードは下記のように入れてください。
#include <windows.h> #include "Resource.h" // このコード モジュールに含まれる関数の宣言を転送します: BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { DialogBox(hInstance, TEXT("DIALOG_BOX"), NULL, (DLGPROC)DialogProc); return 0; } BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { UINT wmId; switch (msg) { case WM_CLOSE: EndDialog(hWnd, IDOK); break; case WM_COMMAND: wmId = LOWORD(wParam); switch (wmId) { case IDM_EXIT: EndDialog(hWnd, IDOK); break; default: break; } default: break; } return FALSE; }
#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDC_HP 109
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif
上記の太線で示している箇所のみ追加です。
#include "Resource.h" ///////////////////////////////////////////////////////////////////////////// // // メニュー // IDC_HP MENU BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "アプリケーションの終了(&X)", IDM_EXIT END POPUP "ヘルプ(&H)" BEGIN MENUITEM "バージョン情報(&A)...", IDM_ABOUT END END ///////////////////////////////////////////////////////////////////////////// // // ダイアログ // DIALOG_BOX DIALOG 0, 0, 170, 62 FONT 9, "MS UI Gothic" CAPTION "ダイアログ" MENU IDC_HP BEGIN LTEXT "Copyright (C) 2008",IDC_STATIC,42,26,114,8 END
上記の太線で示している箇所のみ追加です。