【问题标题】:How to know when focus changes in a CDialog derived class如何知道 CDialog 派生类中的焦点何时更改
【发布时间】:2014-12-10 15:28:30
【问题描述】:

“通用控件”会发送 NM_SETFOCUS 通知,但不会像编辑控件那样发送基本控件。

我的 CDialog 派生类中是否有办法知道焦点何时更改为对话框中的任何控件?如果不在我的对话中,那么可能有任何焦点变化(我可以从 hwnd 中弄清楚)?

【问题讨论】:

  • 我知道我可以暴力破解(必须记住为按钮控件设置“通知”样式标志),但应该有更好的方法,而不必映射不同类型的控件通知消息到每一个控件。

标签: visual-c++ mfc


【解决方案1】:

您应该能够处理CWnd::OnCommand 并捕获命令ID 和通知消息。我会尝试这样的......

if((notificationCode == EN_KILLFOCUS)        ||   
            (notificationCode == LBN_KILLFOCUS) ||
            (notificationCode == CBN_KILLFOCUS) ||
            (notificationCode == NM_KILLFOCUS)  ||
            (notificationCode == WM_KILLFOCUS))

{

 // Here do whatever you want.

}

您可以通过添加等效的 _SETFOCUS 通知来扩展它。

【讨论】:

  • 这不起作用,因为通知代码在所有控件中并不是全局唯一的。 LBN_SETFOCUS 为 4,CBN_SETFOCUS 为 3,但 LBN_SELCANCEL 为 3,CBN_KILLFOCUS 为 4,因此您必须将特定的控制类型与特定的通知代码配对。我希望 MFC 有一个通用的“OnGeneralSetFocus(int iControlID)”。
  • 不这么认为。您需要将其与一些逻辑结合起来。一旦你知道了通知代码和焦点控件,你就可以做你需要做的事情了。唯一的另一种选择是尝试用钩子制作一些东西。但是,我认为这不值得。
  • 我可以使用现有的 MFC 机制强制它(请参阅我对我的问题的评论)。我只是不想为每个控件都这样做,这与您推荐的类似,您的只是处于较低级别,并且与在 MFC 级别执行此操作一样多的维护噩梦(例如,我添加了一个对话框资源的新 CEdit 控件...)。哇!
猜你喜欢
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多