2017-07-01 20 views
3

私はマウスを右クリックしてポップアップメニューを表示するツリービュー(CTreeView)を持っています。 私のコンテキストメニューには3つの項目(A、B、C)しか選択できないため、ツリービューにはチェックボックス付きで注文された料理の長いリストが表示されます。注文商品がない場合はメニュー項目AとBを無効にして、それが有効な場合に有効にします。私はそう項目がチェックされていない場合、一部のコンテキストメニュー項目を無効にする

CFoodView::OnUpdateItemB(CCmdUI* pCmdUI) 
{ 
    if TreeView has no items 
    { 
     pCmdUI->Enable(FALSE); 
    } 
    else 
    { 
     *Search* the tree to get selected items 
     if None is checked 
     { 
      pCmdUI->Enable(FALSE); 
     } 
     else there are checked items 
      pCmdUI->Enable(TRUE); 
    } 
} 

方法CFoodView::OnUpdateItemA(CCmdUI* pCmdUI)のようなそれらの状態を処理するためにCFoodView::OnUpdateItemA(CCmdUI* pCmdUI)//CFoodView inherits CTreeViewCFoodView::OnUpdateItemB(CCmdUI* pCmdUI)を作成

は同じです。

これは、このGUI機能を処理する正しい方法ではないと思います。

答えて

1

まあ、あなたは重要な情報をすべて提出しませんでした。どのようにしてメニュー項目ハンドラを作成しましたか? ハンドラを適切な方法で挿入したと仮定しても、ポップアップメニューをどのように呼び出すかに関する情報は提供されませんでした。 正常に実行された場合は、更新メニューを処理する適切な方法です。 最も一般的な間違いは、ポップアップの更新とコマンドを処理するウィンドウとしてビュー自体を指定することです。これはあなたがハンドラを作成する方法および/またはあなたが呼び出す場所の見直しは動作しません場合は

CWnd *pMainWnd = AfxGetMainWnd(); 
    ASSERT(pMainWnd != nullptr); 

    pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, pMainWnd); 

:MFCメニューの更新メカニズムを使用するためには、あなたではなく、ツリービューにメインウィンドウへのポインタを渡す必要がありTrackPopupMenu関数です。

+0

ご返信ありがとうございます。すべてうまく動作します。私の懸案事項は、** Search **メソッドについてです。このメソッドは、ツリー全体で再帰的に動作し、ツリーのチェックされたノードとリーフを取得します。私は、ユーザーが同時に多くのデータをツリーにロードできるようにすることができないかもしれないと思う。だから私は上記の質問をしました。 ところで、私はMSVS 2017のMFCを使っています。 –

関連する問題