【问题标题】:button keyboard focus issues按键键盘焦点问题
【发布时间】:2010-01-27 00:02:01
【问题描述】:

当按钮在对话框中具有键盘焦点时,如何防止出现在按钮上的小虚线方块。 (为技术术语道歉)。有一次,我通过子类化一个按钮 WindowProc 并颠覆一些 Windows 消息来破解一个解决方案,但想知道正确的方法。

对话框中的另一个控件实际上存在问题,也涉及键盘。这个其他控件实际上也是一个按钮,但用作组合框或面板,而不是用作功能按钮。但是当我在对话框中点击 tab 键时,这个组框“按钮”会出现在前台,遮住了它上面的静态控件,所以我想防止这种情况发生。

对于上述两种情况,我尝试关闭 WS_TABSTOP - 没有帮助。)

【问题讨论】:

  • 您可以尝试在收到 WM_SETFOCUS 消息后将焦点设置为其他内容。
  • 你知道我相信这实际上适用于组框按钮。然而,它不适用于普通按钮 - 它阻止了虚线正方形,但导致了其他问题(有问题的按钮实际上是一个类似按钮的复选框,具有普通按钮的外观,但在“选中”时保持按下状态。它也是键入 BS_ICON,我会根据状态在其上绘制不同的图标。因此禁用 WM_SETFOCUS 时无法正常工作。

标签: c++ winapi visual-c++ mfc


【解决方案1】:

我上面提到的两个问题都通过子类化 WndProcs 并返回 0 以响应消息 0x128 并丢弃它来解决。甚至 Spy++ 也无法识别此消息 0x128,而且我在任何标头中都没有它。但它会在对话框中第一次点击选项卡时发送到对话框中的每个控件。

(我确实尝试过如上所述的 BN_SETFOCUS 和 WM_SETFOCUS,但没有帮助。)

所以如果有人知道在哪里可以找到 Windows 消息 0x128 是什么...

【讨论】:

  • WM_UPDATEUISTATE 是消息:“当绘制键盘提示的窗口收到 WM_UPDATEUISTATE 消息时,它通常会使其自身无效,以便可以根据新状态重新绘制/擦除提示。” -@987654321 @
【解决方案2】:

正确的方法是编写自己的按钮控件,而不是使用默认的 Windows 控件。

或者,您可以防止获得键盘焦点。

【讨论】:

  • 我如何防止他们获得键盘焦点 - 这不是 WS_TABSTOP 的用途(我想无论一般熟练程度如何,我们所有人都存在知识差距。)
  • 最可靠的方法是监听按钮的BN_SETFOCUS通知,然后将焦点设置在其他地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多