如何知道 CDialog 派生类中的焦点何时更改

Posted

技术标签:

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

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

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

【问题讨论】:

我知道我可以暴力破解(必须记住为按钮控件设置“通知”样式标志),但应该有更好的方法,而不必映射不同类型的控件通知消息到每一个控件。 【参考方案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 控件...)。哇!

以上是关于如何知道 CDialog 派生类中的焦点何时更改的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CWinThread 派生类中正确创建 CDialog 框

Visual C++ 6.0 - 派生的 CDialog 类中的 OnInitDialog 不起作用

每次显示前如何更新 ToolTip 文本?

在 MFC DLL 中的 CDialog 派生对象中使用 CScrollView 派生对象

如何访问不在基类中的派生类中的 STL 类的成员函数? (正文中的详细解释)

C#如何将新变量的基类中的变量值更改为派生类