【问题标题】:How do I prevent menu and toolbar clicks stealing focus from a floating form?如何防止菜单和工具栏点击从浮动表单中窃取焦点?
【发布时间】:2014-03-21 11:51:38
【问题描述】:
我想实现与 Visual Studio 2010+ 中相同的效果,如果您将编辑器浮动在主窗体顶部,单击主窗体菜单或工具栏按钮不会导致窃取焦点的主要形式;而是浮动窗口保持焦点。
如果没有这个,当焦点控件位于浮动窗口中时,就无法调用对焦点控件进行操作的任何主菜单命令 - 因为您要操作的控件在调用命令时失去焦点。
(具有讽刺意味的是,如果您仔细查看此图像,您会发现编辑器中的选择被静音,这表明编辑器控件没有具有焦点。Visual Studio 似乎正在做一些稍微歪曲的东西来实现浮动窗口仍然集中的错觉。)
【问题讨论】:
标签:
delphi
focus
toolbar
menubar
【解决方案1】:
如果您使用TActionMainMenuBar 和TActionToolBar,解决方案非常简单。
首先菜单栏:TActionMainMenuBar有一个属性AutoFocus,默认为True。将此设置为 False,然后单击菜单不会自动将焦点放在包含菜单的表单上。相反,先前具有焦点的表单将保留它。
现在工具栏:TActionToolBar 没有 AutoFocus 属性。相反,您需要处理其OnMouseActivate 事件并返回maNoActivate。
请注意,从 OnMouseActivate 处理程序返回 maNoActivate 并不适用于所有控件。无论 OnMouseActivate 处理程序的返回结果如何,某些控件(例如 TButton)都会在单击时为自己提供焦点。但在 TActionToolBar 的情况下,我们确实得到了我们想要的效果。
我花了一段时间才找到这个,即使在 Google 上搜索包含“AutoFocus”和“OnMouseActivate”的页面也没有得到任何有用的结果(可能是这个页面一旦被编入索引)。所以我希望这个答案对其他人有帮助。