如何防止菜单和工具栏点击从浮动表单中窃取焦点?

时间:2014-03-21 11:51:38

标签: delphi focus toolbar menubar

我希望获得与Visual Studio 2010+相同的效果,如果您将编辑器浮动在主窗体之上,则单击主窗体菜单或工具栏按钮不会导致主要形式窃取焦点;相反,浮动窗口保持焦点。

如果没有这个,当聚焦控件处于浮动窗口时,就不可能调用在聚焦控件上操作的任何主菜单命令 - 因为你想要操作的控件在调用命令时失去焦点。

Illustration of menu not stealing focus from floating window

(具有讽刺意味的是,如果你仔细观察这个图像,你会发现编辑器中的选择被静音,表明编辑器控件没有具有焦点.Visual Studio似乎做了一些略微狡猾的事情来实现浮动窗口仍然聚焦的错觉。)

1 个答案:

答案 0 :(得分:5)

如果您使用TActionMainMenuBarTActionToolBar,则解决方案非常简单。

首先,菜单栏:TActionMainMenuBar有一个属性AutoFocus,默认情况下为True。将其设置为False,然后单击菜单将不会自动将焦点放在包含菜单的表单上。相反,以前有焦点的形式将保留它。

现在工具栏:TActionToolBar没有AutoFocus属性。相反,您需要处理其OnMouseActivate事件并返回maNoActivate

请注意,从OnMouseActivate处理程序返回maNoActivate不适用于所有控件。无论OnMouseActivate处理程序的返回结果如何,某些控件(如TButton)在单击时都会自动获得焦点。但是在TActionToolBar的情况下,我们确实得到了我们所追求的效果。

我花了一段时间才发现这一点,甚至在Google上搜索包含“AutoFocus”和“OnMouseActivate”的页面也没有引出任何有用的结果(除了,可能是这个页面被索引后)。所以我希望这个答案可以帮助别人。