2004年06月20日

ポップアップメニュー表示の細かい制御

環境
Visual C++.NET 2003
ライブラリ
MFC 7.1

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 | トラックバック
コメント
コメントする









名前、アドレスを登録しますか?