トップ回答者
メニューの選択について

質問
-
こんにちは、spring-snowです。
現在、Windows API を勉強しています。
ウィンドウにメニュー・サブメニューを実装するまではうまくできたのですが、
サブメニューをクリックしたときに動作をさせることができません。メニューには「ファイル」、そのサブメニューに「開く」と「終了」のみを実装し、
「開く」を選択した場合にはメッセージボックスで「OPEN」、
「終了」を選択した場合にはメッセージボックスで「CLOSE」といった動作確認をしたいのです。エラーもなく実行はできてウィンドウは表示されますが、「開く」、「終了」をクリックしても
メッセージボックスが表示されない状態です。以下、プログラムです。
#include <windows.h> #define IDM_OPEN 4001 #define IDM_CLOSE 4002 LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); //コールバック関数 ATOM WindowClass_Registration(HINSTANCE); //ウィンドウクラス登録関数 HWND Window_Creation(HINSTANCE); //ウィンドウ生成関数 void Menu_Preparation(HWND); //メニュー準備関数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow) { MSG msg; if(!WindowClass_Registration(hInstance)) //ウィンドウクラスを登録できなければ return FALSE; //FALSEを返して終了 if(!Window_Creation(hInstance)) //ウィンドウを生成できなければ return FALSE; //FALSEを返して終了 while(GetMessage(&msg, NULL, 0, 0) > 0){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } ATOM WindowClass_Registration(HINSTANCE hInst) //ウィンドウクラス登録関数 { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1; wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("Sample_MainWindow"); wc.hIconSm = NULL; return (RegisterClassEx(&wc)); } HWND Window_Creation(HINSTANCE hInst) //ウィンドウ生成関数 { HWND hWnd; hWnd = CreateWindowEx(WS_EX_LEFT, TEXT("Sample_MainWindow"), TEXT("Test_Window"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 200, 200, 640, 480, NULL, NULL, hInst, NULL); return hWnd; } void Menu_Preparation(HWND hWnd) { HMENU hMenu, hSubMenu; MENUITEMINFO mii; hMenu = CreateMenu(); hSubMenu = CreatePopupMenu(); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_TYPE; mii.fType = MFT_STRING; mii.dwTypeData = TEXT("開く(&O)"); mii.wID = IDM_OPEN; InsertMenuItem(hSubMenu, 0, TRUE, &mii); mii.fType = MFT_SEPARATOR; InsertMenuItem(hSubMenu, 1, TRUE, &mii); mii.fType = MFT_STRING; mii.dwTypeData = TEXT("終了(&X)"); mii.wID = IDM_CLOSE; InsertMenuItem(hSubMenu, 2, TRUE, &mii); mii.fMask = MIIM_TYPE | MIIM_SUBMENU; mii.hSubMenu = hSubMenu; mii.dwTypeData = TEXT("ファイル(&F)"); InsertMenuItem(hMenu, 0, TRUE, &mii); SetMenu(hWnd, hMenu); } LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //コールバック関数 { switch(uMsg){ case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CREATE: Menu_Preparation(hWnd); return 0; case WM_COMMAND: switch(LOWORD(wParam)){ case IDM_OPEN: MessageBox(hWnd, TEXT("OPEN"), NULL, MB_OK); break; case IDM_CLOSE: MessageBox(hWnd, TEXT("CLOSE"), NULL, MB_OK); break; } return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); }
switch文の中でWM_COMMANDはきちんと選択されているのですが、
その中のswitch文がうまく働いていないみたいです。メニュー選択によって動作させるにはどこを修正すればよいのでしょうか?
回答
-
mii.fMask = MIIM_TYPE;
mii.fMask = MIIM_TYPE | MIIM_ID;
としたらうまくいくのではないでしょうか。- 回答の候補に設定 AzuleanMVP, Moderator 2009年10月21日 13:36
- 回答としてマーク spring-snow 2009年10月30日 2:53
すべての返信
-
mii.fMask = MIIM_TYPE;
mii.fMask = MIIM_TYPE | MIIM_ID;
としたらうまくいくのではないでしょうか。- 回答の候補に設定 AzuleanMVP, Moderator 2009年10月21日 13:36
- 回答としてマーク spring-snow 2009年10月30日 2:53
-
fMaskでメンバの指定を忘れてたんですね…。
たったこれだけの為に、長いプログラムを読んでいただいて本当に申し訳ないです。ご回答ありがとうございました。
- 回答としてマーク spring-snow 2009年10月20日 15:48
- 回答としてマークされていない spring-snow 2009年10月30日 2:53