トップ 戻る | APIで学ぶWindows徹底理解―できるプログラマになるための |
ウインドウのクライアントエリア内で右クリックすると、ポップアップメニューを出す例です。
ポップアップメニューを出すには、TrackPopupMenu()を使います。使い方は簡単で、引数にポップアップメニューのハンドルとスクリーン座標、ウインドウハンドルを渡すと、指定位置に指定されたメニューがポップアップ表示されます。
TrackPopupMenu | |
---|---|
BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, int nReserved, HWND hWnd, HWND prcRect ); | |
hMenu | ポップアップするメニューのハンドル |
uFlags | 表示位置などを指定するフラグ |
x, y | 表示位置(スクリーン座標) |
nReserved | 予約(0) |
hWnd | メニュー選択時のメッセージを受け取るウインドウ |
prcRect | 未使用 |
このTrackPopupMenu()でポップアップメニューを表示する手順としては、
といった流れになるでしょう。ポップアップ位置をスクリーン座標で指定する、という点に注意すれば、特に難しい点はありません。
今回は、ウインドウ内で右クリックされたらポップアップメニューを表示する、という処理を実現するために、ウインドウ作成時にポップアップメニューを作成し、それをWM_RBUTTONDOWNに応じてポップアップするようにしてみました。
ウインドウプロシージャー内メニュー作成・ポップアップ処理 |
---|
case WM_CREATE: /* ポップアップメニュー作成 */ hMenuP = CreatePopupMenu(); /* メニュー項目追加 */ AppendMenu(hMenuP, MF_STRING, 1, "Message"); AppendMenu(hMenuP, MF_STRING, 2, "Exit"); return 0; case WM_RBUTTONDOWN: /* マウスカーソル座標取得 */ pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); /* スクリーン座標に変換 */ ClientToScreen(hwnd, &pt); /* カーソル位置にメニューを出す */ TrackPopupMenu(hMenuP, 0, pt.x, pt.y, 0, hwnd, NULL); return 0; |
ポップアップしたメニューが選択されると、WM_COMMANDメッセージが来るので、選択された項目に応じて処理を行います。今回は、メニューのMessageが選択されたらメッセージダイアログを表示し、Exitが選択されたらウインドウを破棄してプログラムを終了するようにしてみました。
ウインドウプロシージャー内メニュー選択時の処理 |
---|
case WM_COMMAND: switch (LOWORD(wParam)) { case 1: /* Messageメニュー */ MessageBox(hwnd, "Test", "Test", MB_OK); break; case 2: /* Exitメニュー */ DestroyWindow(hwnd); break; } return 0; |
作成したポップアップメニューは、アプリケーション終了時など不要になったらDestroyMenu()で削除します。
実行したら、ウインドウのクライアント領域内でマウスを右クリックしてみてください。ポップアップメニューが表示されます。