右クリックメニューと同じ要領で、ボタンを押した場所にメニューを出すことを考える。
#include <windows.h> #include <tchar.h> #include "resource.h" HMENU hmenu_dummy; const UINT ID_MENU_1 = 100; const UINT ID_MENU_2 = 101; INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ INT_PTR ret = FALSE; switch (msg) { case WM_DESTROY: DestroyMenu(hmenu_dummy); break; case WM_INITDIALOG://メニューの初期設定/////////////////////////// hmenu_dummy = CreatePopupMenu(); //トップのダミーメニュー MENUITEMINFO mii; mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_TYPE; mii.fType = MFT_STRING; mii.wID = ID_MENU_1; mii.dwTypeData = _T("項目1"); InsertMenuItem(hmenu_dummy, ID_MENU_1, FALSE, &mii);//メニューに項目追加 mii.wID = ID_MENU_2; mii.dwTypeData = _T("項目2"); InsertMenuItem(hmenu_dummy, ID_MENU_2, FALSE, &mii);//メニューに項目追加 break; case WM_COMMAND: switch(wp){ case IDC_BUTTON_MENU://ボタンを押したとき////////////////////// { RECT brect;//ボタンの矩形を取得 GetWindowRect(GetDlgItem(hWnd, IDC_BUTTON_MENU),&brect); TrackPopupMenu(//メニューを表示 hmenu_dummy, TPM_LEFTALIGN, //↓に指定する座標はメニューの左上 brect.left,brect.top + (brect.bottom-brect.top), 0, hWnd,//親ウィンドウ nullptr ); break; } case ID_MENU_1://メニュー1が押された//////////////////////// MessageBox(hWnd,_T("メニュー1"),0,0); break; case ID_MENU_2://メニュー2が押された//////////////////////// MessageBox(hWnd,_T("メニュー2"),0,0); break; } break; // ダイアログを閉じる case WM_CLOSE: EndDialog( hWnd , (INT_PTR)WM_CLOSE ); ret =TRUE; break; } return ret; } /////////////////////////////////////////////// // エントリーポイント ////////////////////////// ////////////////////////////////////////////// int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { INT_PTR d = DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),nullptr,(DLGPROC)DlgWndProc ); PostQuitMessage(0); return 0; }