Windowsのデスクトップやエクスプローラなどでマウスの右ボタンをクリックすると、ポップアップメニュー(フローティングメニュー)が出てきますね。今回は、自作プログラムでやってみます。単にメニューを作って右クリックされたら画面に出すだけ、なのですが2点ほど注意点があるようです。 メニュー作成APIでメニューを作るには、CreateMenu()でメニューのハンドルを作成してAppendMenu()でメニューの項目を追加していきます。AppnedMenu()にメニューハンドルと項目の種類、WM_COMMAND時に送るIDと項目を指定すれば項目が追加されていくので、項目を順に並べてメニューを作っていきましょう。メニューを作ったらTrackPopupMenu()でポップアップできます。ただし、フローティングメニューではトップレベルにダミーのメニューを作りそこに表示するメニューを追加してトップレベルメニューを表示する、という形になるようです(フローティングメニュー自体を表示しようとしてもうまく行かない)。 hMenu=CreateMenu(); /* トップレベルメニュー */ hMenuP=CreateMenu(); /* フローティングメニュー */ /* フローティングメニュー作成 */ AppendMenu(hMenuP,MF_STRING,1,"Message"); AppendMenu(hMenuP,MF_STRING,2,"Exit"); /* フローティングメニューをメニューに登録 */ AppendMenu(hMenu,MF_POPUP,(UINT)hMenuP,NULL); これで「Message」と「Exit」という文字列を持つフローティングメニューhwMenuPとそのメニューを載せるhwMenuが出来ました。後は、マウスの右クリックでTrackPopupMenu()にメニューを表示する座標(通常はマウスのカーソル座標)を指定しポップアップさせれば良いのですが、この時に指定する座標は「スクリーン座標」なので注意が必要です。WM_RBUTTONDOWNのlParamに入っているカーソル座標は「ウインドウ上の」座標なので、これをClientToScreen()でスクリーン座標に変換します。 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; メニューが選択されると、AppendMenuで指定したIDとともにWM_COMMANDメッセージがウインドウにが送られてくるので処理します。 case WM_COMMAND: switch (LOWORD(wParam)) { case 1: /* Messageメニュー */ MessageBox(hwnd,"Test","Test",MB_OK); break; case 2: /* Exitメニュー */ DestroyWindow(hwMain); break; } return 0; プログラム実行後にウインドウ内で右クリックするとメニューが出てきます。 |