ポップアップメニュー表示時にON_COMMAND_UIを呼び出したい

[戻る]
ユリ 2003/02/02(日) 09:45:10
リストビューで選択アイテムがあったら
[編集]-[切り取り]をEnable
選択アイテムがなかったらDisableにしたいと思っています。

メニューバーの処理は以下のコードで実現できました。
void CHogeListView::OnUpdateEditCut(CCmdUI* pCmdUI) 
{
  // TODO: この位置に command update UI ハンドラ用のコードを追加してください
  if (GetListCtrl().GetSelectedCount() > 0)
    pCmdUI->Enable(TRUE);
  else
    pCmdUI->Enable(FALSE);
}

ポップアップメニューについても同様の処理を行いたいのですが
OnUpdateEditCutが呼び出されないため
つねに[編集]-[切り取り]がEnableになってしまいます。
どのようにコーディングしたらよいでしょうか?

ポップアップメニュー表示は以下のコードで行っています。
void CHogeListView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
  // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
  CMenu    menu;
  menu.LoadMenu(IDR_HOGE_POPUP);
  CMenu*    pMenu=menu.GetSubMenu(0);

  pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, 
pWnd);
  menu.DestroyMenu();
}

開発環境はWinMe, VC++6.0SP5 MFCです。

TAD [E-Mail] 2003/02/02(日) 10:05:50
TrackPopupMenu の第4引数に、メインウィンドウのポインタを指定してみてください。

pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, 
AfxGetMainWnd());

こうすることで、更新コマンドハンドラが呼ばれるようになると思います。

ユリ 2003/02/02(日) 13:36:38
TADさんの示された方法でうまく動作しました。
ただ、MSDNにはTrackPopupMenuの第4引数には
ポップアップ メニューを所有するウィンドウを
指定すると記載されています。

AfxGetMainWnd()だとCMainFrame*を渡すことになりますが
問題はないのでしょうか?

dairygoods 2003/02/03(月) 11:28:00
所有するウィンドウとは、メニューが更新や選択のメッセージを送る宛先のことです。
ありがたいことに、CMainFrameには、メニューから送られてくるメッセージ
を処理して、更新ハンドラや選択ハンドラを呼び出す処理があらかじめ含まれ
ているので、問題ありません。

ユリ 2003/02/03(月) 12:19:17
[[解決]]
>所有するウィンドウとは、メニューが更新や選択のメッセージを送る宛先のことです。
そういうことだったんですか。
「所有するウィンドウ」について私の認識が誤ってました。

ありがとうございました。

古いスレッドには追加発言できません。