是否可以看到控制焦点丢失到哪里?

Posted

技术标签:

【中文标题】是否可以看到控制焦点丢失到哪里?【英文标题】:Is it possible to see where control focus is being lost to? 【发布时间】:2016-01-22 12:03:53 【问题描述】:

我在一个对话框中有一个ClistCtrl(为非 MFC 用户包装 Windows 列表视图)。我设置的功能是,当列表失去焦点时,任何选定的项目都不会被选中。

我还有一个“删除项目”按钮,其点击处理程序将删除列表中的所有选定项目。

这个想法是您选择列表中的项目,然后单击按钮删除这些项目,或者单击其他位置并取消选择。

但是,当您单击删除按钮时,列表会失去焦点首先,因此没有任何反应!有没有办法解决这个问题?

【问题讨论】:

WM_KILLFOCUS 告诉您输入焦点正在移动到哪个窗口 @DavidHeffernan 要在带有控件的 CDialog 上下文中捕捉到这一点,我是否必须实现 PreTranslateMessage 或其他什么?一个代码示例在答案中真的很棒,我总是忘记在我的消息映射中我可以和不能添加事件通知器。 网络搜索会告诉你如何 @DavidHeffernan 到目前为止还没有。这就是我问的原因。我只是得到一团糟的结果……可能我的搜索词不是很好。 如果没有任何东西显示如何在 MFC 应用程序中捕获 Windows 消息,我会感到惊讶。似乎难以置信。 【参考方案1】:

您可以使用WM_KILLFOCUS 接收关于失去焦点的消息,它的 wParam 将为您提供获得焦点的窗口句柄:

w参数

接收键盘焦点的窗口句柄。这 参数可以为NULL。

您应该能够使用 Spy++ 在您的列表窗口上查看 WM_KILLFOCUS,并读取它的 wParam - 稍后还可以使用 spy++ 找到它是哪个窗口。

【讨论】:

这也兼容ON_NOTIFY(NM_KILLFOCUS,...)吗?或者我应该问一下,MFC 中的代码是什么样的 - 我是在对话框中捕获 WM_KILLFOCUS 并检查控件 ID,还是在特定控件上设置处理程序? 是的 ON_NOTIFY(NM_KILLFOCUS, 如果您想在对话函数中接收给定控件的消息,应该可以工作。 问题是,我看不到窗口在哪里获得焦点 (msdn.microsoft.com/en-us/library/windows/desktop/…) [伪] 代码示例会让您的答案更完整? 你是对的,这不能通过通知来完成,你必须继承你的列表控件。也许其他人会建议如何做到这一点。 谢谢。我对此很熟悉,只是希望我不必麻烦。然后,我无法从对话框中捕获/拦截/检查每个控件的消息,例如覆盖CWnd::PreTranslateMessage()?【参考方案2】:

正如其他帖子中所说,您可以使用WM_KILLFOCUS

但我认为在失去焦点时清除选择是一个非常糟糕的主意

想象一下:用户使用多选(使用 shift、ctrl、滚动条..)选择了一大堆项目,然后发生以下情况之一:

电话响起,紧急呼叫 - 用户需要查看邮件:选择:已消失!

一个恼人的消息框弹出并获得焦点(是的,确实发生了):选择 -> 消失了。

您的用户可能会因此而讨厌您,所以不要这样做 :)(即使列表控件中只有 3 个项目也不行)。

通常的方法是在失去焦点时使选择变灰。您可以添加一个“清除选择”按钮,但即使这样也不需要。只需单击一项即可清除选择(当然,该一项除外)。

底线:永远不要在失去焦点时清除选择。

更新

如果在失去焦点时选择不可见,则需要 LVS_SHOWSELALWAYS 标志:

LVS_SHOWSELALWAYS

选择(如果有)始终显示,即使控件不显示 有重点。

【讨论】:

好吧,当焦点丢失时,您将无法再看到选择 是什么。所以现在你选择了一些项目,点击不同的控件,不知道点击删除按钮会发生什么。 @Mr.Boy - 好吧,那应该先解决。您是以标准方式使用 ClistCtrl,还是用户/自定义/所有者绘制?通常的方法是在失去焦点时使选择变灰。在您的情况下,您可以从对话框中控制它:当对话框失去焦点时为灰色,当对话框获得焦点时再次设置为选择颜色(因为用户无法在列表内单击,因为这也会清除选择)。 @Mr.Boy - 请查看LVS_SHOWSELALWAYS 了解更多详情(请参阅我的更新答案)。 出于某种原因,请参阅我的相关问题 (***.com/questions/34945788/…),这似乎不适用于文本项,仅适用于图标。 那会很奇怪.. 稍后我会尝试编写一个小测试(我通常在报告模式下使用 ClistCtrl,这很好用)。解决此问题的另一种方法是使用自定义绘图或所有者绘图。比您拥有完全的控制权。

以上是关于是否可以看到控制焦点丢失到哪里?的主要内容,如果未能解决你的问题,请参考以下文章

TableView 不会在焦点丢失事件上提交值

java swing中如何自行丢失焦点?已知怎样获取没找到如何丢失!

不想让人看到的日记最好保存在那里好呢?而且还永远不会丢失。

C#组合框,将文本值分配给焦点丢失事件的变量?

如何发现 TextField 编辑被取消/键盘折叠/焦点丢失

JavaScript / DOM:如果焦点丢失到另一个窗口(应用程序),如何防止模糊事件