是否可以看到控制焦点丢失到哪里?
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,这很好用)。解决此问题的另一种方法是使用自定义绘图或所有者绘图。比您拥有完全的控制权。以上是关于是否可以看到控制焦点丢失到哪里?的主要内容,如果未能解决你的问题,请参考以下文章
java swing中如何自行丢失焦点?已知怎样获取没找到如何丢失!