我有一个树形视图(CTreeView
),在我右键单击鼠标后会显示一个弹出菜单。
在我的上下文菜单中,只有3个项目(即A,B,C)可供选择,我的树状视图显示了一系列用复选框设计的有序食品。如果没有检查订购的食物,我想禁用菜单项A和B,并在任何时候启用它们。
我创建CFoodView::OnUpdateItemA(CCmdUI* pCmdUI)
//CFoodView inherits CTreeView
和CFoodView::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功能的正确方法。
答案 0 :(得分:1)
好吧,你没有提交所有重要信息。你是如何创建菜单项处理程序的? 假设您以正确的方式插入处理程序,仍未提供有关如何调用弹出菜单的任何信息。 如果您所做的一切都已正确完成,那么这是处理更新菜单的正确方法。 最常见的错误是将视图本身指定为处理弹出更新和命令的窗口。为了使用MFC菜单更新机制,您必须将指针传递给主窗口而不是树视图:
CWnd *pMainWnd = AfxGetMainWnd();
ASSERT(pMainWnd != nullptr);
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, pMainWnd);
如果这不起作用,请重新检查创建处理程序的方式和/或调用TrackPopupMenu函数的位置。