リストビューで選択アイテムがあったら
[編集]-[切り取り]を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です。
TrackPopupMenu の第4引数に、メインウィンドウのポインタを指定してみてください。
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
AfxGetMainWnd());
こうすることで、更新コマンドハンドラが呼ばれるようになると思います。
TADさんの示された方法でうまく動作しました。
ただ、MSDNにはTrackPopupMenuの第4引数には
ポップアップ メニューを所有するウィンドウを
指定すると記載されています。
AfxGetMainWnd()だとCMainFrame*を渡すことになりますが
問題はないのでしょうか?
所有するウィンドウとは、メニューが更新や選択のメッセージを送る宛先のことです。
ありがたいことに、CMainFrameには、メニューから送られてくるメッセージ
を処理して、更新ハンドラや選択ハンドラを呼び出す処理があらかじめ含まれ
ているので、問題ありません。
>所有するウィンドウとは、メニューが更新や選択のメッセージを送る宛先のことです。
そういうことだったんですか。
「所有するウィンドウ」について私の認識が誤ってました。
ありがとうございました。