【问题标题】:Disable some context menu items if no items are checked如果未选中任何项目,则禁用某些上下文菜单项
【发布时间】:2017-12-05 05:04:56
【问题描述】:

我有一个树形视图 (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 功能的正确方法。

【问题讨论】:

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


    【解决方案1】:

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

        CWnd *pMainWnd = AfxGetMainWnd();
        ASSERT(pMainWnd != nullptr);
    
        pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, pMainWnd);
    

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

    【讨论】:

    • 感谢您的回复。一切正常。我关心的是 Search 方法,它在整个树中递归地工作以检索树的检查节点和叶子。我认为这可能不好,因为我允许用户同时将大量数据加载到树中。所以我问了上面的问题。顺便说一下,我使用的是 MSVS 2017 的 MFC。
    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多