如果未选中任何项,则禁用某些上下文菜单项

时间:2017-07-01 10:39:11

标签: c++ visual-c++ mfc mfc-feature-pack

我有一个树形视图(CTreeView),在我右键单击鼠标后会显示一个弹出菜单。 在我的上下文菜单中,只有3个项目(即A,B,C)可供选择,我的树状视图显示了一系列用复选框设计的有序食品。如果没有检查订购的食物,我想禁用菜单项A和B,并在任何时候启用它们。

我创建CFoodView::OnUpdateItemA(CCmdUI* pCmdUI) //CFoodView inherits CTreeViewCFoodView::OnUpdateItemB(CCmdUI* pCmdUI)处理他们的状态

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)是相同的。

我认为这不是处理此GUI功能的正确方法。

1 个答案:

答案 0 :(得分:1)

好吧,你没有提交所有重要信息。你是如何创建菜单项处理程序的? 假设您以正确的方式插入处理程序,仍未提供有关如何调用弹出菜单的任何信息。 如果您所做的一切都已正确完成,那么这是处理更新菜单的正确方法。 最常见的错误是将视图本身指定为处理弹出更新和命令的窗口。为了使用MFC菜单更新机制,您必须将指针传递给主窗口而不是树视图:

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

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

如果这不起作用,请重新检查创建处理程序的方式和/或调用TrackPopupMenu函数的位置。