トップ 戻るAPIで学ぶWindows徹底理解―できるプログラマになるための

右クリックポップアップメニュー

ウインドウのクライアントエリア内で右クリックすると、ポップアップメニューを出す例です。

TrackPopupMenu

ポップアップメニューを出すには、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()でポップアップメニューを表示する手順としては、

  1. CreatePopupMenu()でポップアップメニューを作成
  2. 作成したポップアップメニューにAppendMenu()で項目を追加
  3. 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()で削除します。

プログラム

実行したら、ウインドウのクライアント領域内でマウスを右クリックしてみてください。ポップアップメニューが表示されます。

プログラムソース表示 プログラムダウンロード


トップ 戻る