CMenu::TrackPopupMenuを呼び出してポップアップメニューを表示した際、
メニュー項目を選択するとCMenu::TrackPopupMenuから戻ってきますが、
メニューコマンド自体はSendではなくPostされるので、
一旦OSに制御を返さないとメニューコマンドの処理は行われません。
メニューコマンド処理後、何か別の処理を行いたいというとき、これではちょっと不便です。
特に、メニュー項目を選択せずキャンセルした場合、何もメニューコマンドがPostされないので、
ポップアップメニューをキャンセルしたときに何か処理をさせる方法がありません。
そこで、選択したメニュー項目のIDを取得し、SendMessageによりメニューコマンドを送信する方法を以下に示します。
// CPoint pointにはメニューを表示させる座標が格納されているものとします。 CMenu menu; menu.LoadMenu(IDR_MENU/*メニューID*/); CMenu* pPopup = menu.GetSubMenu(0); SendMessage(WM_INITMENUPOPUP, reinterpret_cast(pPopup->GetSafeHmenu()), MAKELPARAM(0, FALSE)); UINT nId = pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_NONOTIFY, point.x, point.y, this /*thisがCWnd派生クラスの場合*/); if (nId != 0) { SendMessage(WM_COMMAND, MAKEWPARAM(nId, 0), NULL); /* ポップアップメニュー処理後の処理 */ }else { /* ポップアップメニューがキャンセルされたときの処理 */ }
ポイントはTrackPopupMenuの第一引数です。こんなフラグもあるんですねー。
投稿者 MASATO : 2004年06月20日 00:12 | トラックバック