ショートカットメニューメニューの表示というのは、何もウインドウのメニューバーだけに限ったことではありません。アプリケーションも大変多く存在します。これを任意のタイミングで表示することでショートカットメニューと呼ばれたりしています。ポップアップメニューを明示的に表示するには、TrackPopupMenuを呼び出します。*prcRect);hMenuは、ポップアップメニューのハンドルを指定します。CreatePopupMenuの戻り値を指定します。uFlagsは、メニューの表示方法に関わるフラグですが、基本的に0で構いません。xは、スクリーン座標で表されたメニューの水平位置を指定します。yは、スクリーン座標で表されたメニューの垂直位置を指定します。nReservedは、0でなければなりません。hWndは、ウインドウのハンドルを指定します。項目を選択したとき、このウインドウにWM_COMMANDが発行されます。prcRectは無視されるため、NULLを指定しておけばよいと思われます。TrackPopupMenuの第2引数にTPM_NONOTIFYを指定した場合は、WM_INITMENUPOPUPが送られなくなることに注意してください。自作メニューがこうした動作を行うつもりがないのであればTPM_NONOTIFYを指定しても問題ありません。そのような場合にTPM_NONOTIFYを指定していると、項目が正しく表示されないことがあります。ちなみに、TPM_NONOTIFYを指定した場合でもWM_MENUSELECTは送られるようになっています。今回のプログラムは、ウインドウ上で右クリックしたときにポップアップメニューを表示します。TEXT("コピーが選択されました。TEXT("貼り付けが選択されました。&mii);}ウインドウ上で右クリックしたときには、WM_CONTEXTMENUが送られます。可能な限りWM_CONTEXTMENUを処理した方がよいでしょう。スクリーン座標で表現しているからです。クライアント座標をスクリーン座標に変換する作業が生じることになります。しても、WM_RBUTTONDOWNで処理したい場合は以下のようになるでしょう。0;}今回は、WM_DESTROYでメニューハンドルを破棄しています。DestroyMenu(hmenuPopup);DestroyMenuを呼び出すのは、このメニューがウインドウに割り当てられていないからです。割り当てられていない場合は、メニューの破棄はプログラムが負います。この関数に破棄されたメニューを指定した場合、0が返ります。原理的にはTrackPopupMenuの呼び出しで生じていると考えて問題ないでしょう。アプリケーションは任意のタイミングでシステムメニューを表示できます。実際にはこのメニューの項目を選択しても何も起きることはありません。単純に上記のようにTrackPopupMenuを呼ぶだけでは効果がないのです。そこで、TrackPopupMenuの第2引数のフラグを利用することになります。0);TPM_RETURNCMDという定数を指定した場合は関数の戻り値が選択した項目の識別子となり、WM_COMMANDは送られません。実際に項目を選択したのと同じ効果が生じます。