c++ - 防止 View 窃取焦点/将焦点设置到 View

标签 c++ windows mfc

我有一个 MFC sdi 应用程序,它使用分隔窗口在显示数据的主视图旁边包含一个树控件。

当用户在树中选择某些内容时,该 View 会保持焦点,直到用户有意单击主数据窗口。这意味着与主视图关联的任何工具栏按钮都被禁用。

在用户单击树控件后,是否有任何方法可以通过编程将焦点切换回主视图?还是我使用 CSplitterWnd 和 2 个 View 做了一些根本性的错误?

最佳答案

您不希望在有人单击树后立即将焦点带回另一个 View :这会使您的应用无法使用。例如这会阻止用户使用键盘在树中导航,因为树永远不会将焦点保持足够长的时间。

如果您真的希望工具栏始终反射(reflect)您的第二个 View 的状态(我不确定这是个好主意),您有几个选择。做出你的选择。想到 2 个:

  1. 你的 TreeView 不应该是 CView .使用简单的 CTreeCtrl .不太好,因为它打破了文档/ View 范式(例如,不再调用树的 OnUpdate() 每当调用 UpdateAllViews() 时)。

  2. 防止树成为事件 View 。为此:

    2.a.当您查看获得焦点时(OnSetFocus()):

    STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd())->SetActiveView(pTheOtherView);
    

    2.b.导出 CMySplitterWnd来自 CSplitterWnd 的类(class), 然后覆盖 CMySplitterWnd::SetActivePane()以防止它将 TreeView 设置为事件 View 。

在任何情况下,欢迎来到 MFC 内部的奇妙世界,在这里深入研究源代码是强制性的日常运动;-)

关于c++ - 防止 View 窃取焦点/将焦点设置到 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/188393/

相关文章:

c++ - 无法捕获 std::invalid_argument

c++ - 为什么从基模板类继承并将两个类文件放在单独的头文件中时会出现重定义错误?

c++ - 删除与空复制构造函数

c - 可能的 GCC 错误 : Long arguments shortened when linking a library to project. C\C++

java - AVD Manager 无法找到 tools\android.bat,即使它在那里

c++ - 使用编译器生成的赋值运算符安全吗?

c++ - 在 sqlite3pp 中捕获异常

c++ - 当您按下 "Enter"键时,在 Windows super 终端下发送什么字符

c++ - MFC应用程序中的工具栏对齐

c++ - 添加 #include <boost/thread/mutex.hpp> 会破坏我的 ActiveX 控件吗?