none
メニューの選択について RRS feed

  • 質問

  • こんにちは、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文がうまく働いていないみたいです。

    メニュー選択によって動作させるにはどこを修正すればよいのでしょうか?

    2009年10月20日 7:44

回答

すべての返信

  • mii.fMask = MIIM_TYPE;
    mii.fMask = MIIM_TYPE | MIIM_ID;

    としたらうまくいくのではないでしょうか。
    2009年10月20日 8:03
  • fMaskでメンバの指定を忘れてたんですね…。
    たったこれだけの為に、長いプログラムを読んでいただいて本当に申し訳ないです。

    ご回答ありがとうございました。

    • 回答としてマーク spring-snow 2009年10月20日 15:48
    • 回答としてマークされていない spring-snow 2009年10月30日 2:53
    2009年10月20日 15:48
  • MSDN フォーラムにおける「回答としてマーク」は役に立った回答に対してつけるようにお願いします。
    今回のケースであれば、Atsushi777 さんの投稿が該当すると思います。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年10月20日 16:04
    モデレータ