【问题标题】:Focus rectangle not showing even if control has focus即使控件具有焦点,焦点矩形也不会显示
【发布时间】:2017-09-29 13:10:00
【问题描述】:

我在 MFC 应用程序中遇到以下问题:

控件中的焦点矩形并不总是显示,即使控件具有焦点。

重现步骤:

  • 启动应用程序
  • 点击控件
  • 焦点矩形未显示:
  • 使用 Alt-Tab 切换到另一个应用程序
  • 切换回我的应用程序
  • 点击控件
  • 现在焦点矩形按预期显示:
  • 从现在开始,控件上的焦点矩形在获得焦点时会正确显示。

好像有两种“模式”,一种是显示焦点矩形,另一种是不显示。

其他事实:

  • 控件确实具有焦点,因为使用向上/向下箭头键可以更改所选项目
  • 它在 Windows 10 上运行
  • 当我们处于不显示焦点矩形的“模式”时,程序的行为仍然正确。

有人遇到过这样的问题吗?我想知道这是否是一些“聪明”的微软功能。

【问题讨论】:

  • 它应该是一个功能。它与隐藏焦点提示有关,直到用户使用键盘导航。我从来没有真正理解它是如何工作的,但是您可以通过在初始化时使用 wparam = 0x10002 将 WM_UPDATEUISTATE 发送到您的窗口来禁用它。
  • @HansPassant 类似于在您按下 Alt 键之前不会显示的加速键下划线?
  • @HansPassant 它是如何工作的?很简单,如果您使用键盘进行导航,您就会得到提示。如果您只使用鼠标,则不会,因此 UI 看起来会更干净。按 Win+R 并输入“calc”启动 Calc,您将看到一个焦点矩形。通过单击快捷方式启动它,您不会。

标签: winapi mfc


【解决方案1】:

这是一种称为“键盘提示”(SPI_GETKEYBOARDPREFSPI_GETKEYBOARDCUES)的 Windows 功能,较新版本的 Windows 默认将它们(焦点矩形和带下划线的键盘访问键)隐藏在基于对话框的窗口中。这个功能是introduced in Windows 2000

Windows 对话框管理器初始化对话框based on the last input(鼠标或键盘):

窗口的默认状态是显示所有指标。但作为一个特殊技巧,对话框管理器将在对话框初始化后发送带有 UIS_INITIALIZE 的 WM_UPDATEUISTATE 消息,如果最后一个输入事件是鼠标事件,则关闭指示器。

您可以使用MAKELONG(UIS_CLEAR, UISF_HIDEFOCUS)WM_UPDATE­UI­STATE 消息发布到对话窗口以显示焦点矩形(如果您希望覆盖Windows 默认设置)。

【讨论】:

  • 您可以发布 WM_UPDATEUISTATE ...请不要乱用默认值,这对很多人来说都很好。如果人们不喜欢默认设置,他们会更改系统设置,但这将是他们的选择,而不是应该为他们决定的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2021-05-23
  • 2019-04-03
  • 1970-01-01
相关资源
最近更新 更多