防止视图窃取焦点/将焦点设置到视图

Posted

技术标签:

【中文标题】防止视图窃取焦点/将焦点设置到视图【英文标题】:Prevent views stealing focus/setting focus to a view 【发布时间】:2008-10-09 17:49:14 【问题描述】:

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

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

在用户单击树形控件后,有没有办法以编程方式将焦点切换回主视图?还是我在使用 CSplitterWnd 和 2 个视图时做错了什么?

【问题讨论】:

【参考方案1】:

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

您真的希望工具栏不断反映您的第二个视图的状态(我不确定这是一个好主意),您有几个选择。做你的选择。 2 想到:

    您的树视图不应该是CView。使用简单的CTreeCtrl。不是很好,因为它有点打破了文档/视图范式(例如,每当调用 UpdateAllViews() 时,不再调用树的 OnUpdate())。

    防止树成为活动视图。这样做:

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

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

    2.b。从CSplitterWnd 派生CMySplitterWnd 类,然后覆盖CMySplitterWnd::SetActivePane() 以防止将树视图设置为活动视图。

在所有情况下,欢迎来到 MFC 内部的精彩世界,深入研究源代码是每天必做的运动;-)

【讨论】:

有人说 - MFC 的专业知识来自于知道如何绕过它!

以上是关于防止视图窃取焦点/将焦点设置到视图的主要内容,如果未能解决你的问题,请参考以下文章

NSCollectionView 在 selectable=YES 时窃取焦点

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

如何防止滚动到焦点 EditText [重复]

UICollectionView 窃取焦点

如何使用 CSS 或 JS 防止 iOS 键盘将视图推离屏幕

Xamarin Forms - 防止键盘在 UWP、Android、iOS 中的条目焦点上显示