今回は、ダイアログボックスにメニューを付けます。メニューから、アプリケーションを終了できるようにします。
テキストの表示 - インコのWindowsSDK で作成したソースを修正します。
ここでは、Reseditで作成する方法も説明します。
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]
コントロールID MENU BEGIN POPUP "メニュー1(&*)" BEGIN MENUITEM "項目1(&*)", **** MENUITEM "項目2(&*)", **** END POPUP "メニュー2(&*)" BEGIN MENUITEM "項目1(&*)", **** MENUITEM "項目2(&*)", **** END END
親メニューはPOPUP、子メニューはMENUITEMで表記します。
子メニューの始めにBEGINを入れ、と最後にENDを入れます。
方法1 : Visual Studioのリソース ビューからメニューを追加
Visual Studio Expressでは、この方法は利用できません。
Visual Studio Express 以外の場合は、Visual Studioからメニューを追加できます。
右上のウインドウから「リソース ビュー」のシートをクリック。
リソースファイルを右クリックして、メニューを開き、「リソースの追加(A)...」を選択してください。
「リソースの追加」ダイアログが開くので、リソースの種類(T):「Dialog」を選択してから、 「新規作成」ボタンをクリックしてください。
プレビュー画面の「ここへ入力」となっているところを、1回クリックすると、メニュー名を入力できるようになるので、
メニュー名を入力します。ここでは「ファイル(&F)」と入力します。
メニューの項目名も入力できるので入力します。ここでは「アプリケーションの終了(&X)」と入力します。
ここで(&F)」と入力すると、表示が下記のように下線付きになり、Altキーを押しながらFキーを押すと、直接選択できるメニューを作成できます。
方法2 : Reseditからメニューを追加
「リソース(Resources)」ウインドウを右クリック - 「リソースの追加(Add Resource)...」 - 「メニュー(Menu) Ctrl+M」 でメニューを追加
プレビュー画面のType hereとなっているところを、2回クリックすると、左側にメニューを追加できるので、
メニュー名を入力します。
<※全角文字を入力する場合、確定するまでは、入力した文字が画面に表示されません。>
メニュー名を入力できたら、Type hereをシングルクリックしてから、先ほど入力したメニューをクリックします。
メニューの下にType hereが出てくるので、これを2回クリックすると、上側にメニューの項目を追加
できるので、メニューの項目名を入力します。
ダイアログボックスにメニュー[MENU]を追加
MENU id
id | コントロールID |
メニューをVisual Studioのリソース ビューやResEditで追加すれば、Visual Studioのリソース ビューやResEditから、ダイアログボックスの「プロパティ(Properties)」ウインドウで、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, 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
Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。
#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
Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。