C++ MFC 改变菜单焦点

Posted

技术标签:

【中文标题】C++ MFC 改变菜单焦点【英文标题】:C++ MFC change menu focus 【发布时间】:2017-08-21 14:09:31 【问题描述】:

我有一个视图/窗口的问题,左侧有一个树视图,右侧有一个列表样式视图,它显示与右侧选择的树节点相对应的“东西”。非常类似于 Windows 资源管理器的外观和工作方式。 “东西”可以显示为列表、大图标或小图标或信息。

我遇到的问题是,如果选择的树节点之一是“占位符”节点,则从“编辑”菜单运行“全选”,然后在“编辑”菜单中的“删除”选项灰显即使 RHS 视图中的所有项目都标记为已选中并且实际上可以安全删除。 这可以通过从树节点选择到另一个节点,然后选择回到同一个树节点,然后选择不同的视图来解决:列表、大图标、小图标或信息视图,而不是最初选择的视图。

跟踪语句告诉我,在第二个工作场景中,右侧视图中的项目被传递给“我可以删除”函数,而当事情不工作时,它是被传递的树视图节点的名称到“我可以删除”功能。当“我可以删除”函数返回 true 时,在 Edit 菜单中启用“delete”选项,如果为 false,则不启用。

当从“编辑”菜单中选择“全选”以使这项工作一直正常时,有没有一种方法可以强制“焦点”在右侧列表、信息等视图中缺少更好的词?

我认为问题在于编辑菜单不同(上下文相关)取决于哪个视图(“它”认为)处于活动状态并且某处电线交叉,并且编辑菜单正在显示树视图时应该显示对于 RHS 节点列表视图。它正在研究如何解决我正在努力解决的问题。

谢谢

【问题讨论】:

【参考方案1】:

MFC 命令路由有问题。

检查您放置命令处理程序的位置。

按以下顺序搜索命令处理程序:

    活动视图 文档 文档模板 框架窗口 应用程序。

我想您在视图中有处理程序,并且焦点(活动视图)发生了变化

您可以更改命令路由,即在框架中并要求附加到文档的所有视图处理命令...您必须为此覆盖OnCmdMsg。

查看更多详情here

【讨论】:

你的回答似乎连接了我大脑中的一些编码线。我在列表/信息类中找到了 OnEditSelectAll 处理程序,并从那里在父框架窗口上调用了 Setactiveview,确保视图位于列表/信息中,并且删除功能现在似乎工作正常。谢谢!虽然不确定我所做的在技术上是否是黑客行为...... ;-)

以上是关于C++ MFC 改变菜单焦点的主要内容,如果未能解决你的问题,请参考以下文章

如何杀死 MFC 向导按钮的焦点

ListView 在 mfc 中杀死焦点

MFC:将焦点设置到子窗口时如何防止应用程序成为前台窗口

如何在 MFC 中获得焦点消息?

MFC使控件失去焦点的方法

将焦点放在托管在 MFC 视图中的无模式对话框上