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

Visual c++ 如何知道CDialog派生类中的焦点何时更改,visual-c++,mfc,Visual C++,Mfc,“通用控件”发送NM_SETFOCUS通知,但不发送编辑控件等基本控件 在我的CDialog派生类中,是否有方法知道焦点何时更改为对话框中的任何控件?如果不在我的对话框中,那么可能会有任何焦点更改(我可以从hwnd中找到)?您应该能够处理并捕获命令ID和通知消息。我想试试这样的 if((notificationCode == EN_KILLFOCUS) || (notificationCode == LBN_KILLFOCUS) ||

“通用控件”发送NM_SETFOCUS通知,但不发送编辑控件等基本控件


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

您应该能够处理并捕获命令ID和通知消息。我想试试这样的

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

{

 // Here do whatever you want.

}

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

我知道我可以强制执行它(记住为按钮控件设置“Notify”样式标志),但是应该有更好的方法,不必将不同类型的控件通知消息映射到每个控件。这不会起作用,因为通知代码在所有控件中不是全局唯一的。LBN_SETFOCUS为4,CBN_SETFOCUS为3,但LBN_SELCANCEL为3,CBN_KILLFOCUS为4,因此必须将特定控件类型与特定通知代码配对。我希望MFC有一个通用的“OnGeneralSetFocus(intIControlId)”。我不这么认为。你需要结合一些逻辑。一旦知道了通知代码和焦点控件,就可以执行需要执行的操作。唯一的另一种选择是尝试用钩子制作一些东西。但是,我认为这不值得付出努力。我可以使用现有的MFC机制(请参阅我对我的问题的评论)来强制执行它。我只是不想对每个控件都这样做,这与您推荐的类似,您的控件只是处于较低的级别,并且与在MFC级别进行操作一样是维护的噩梦(例如,我向对话框资源添加了一个新的CEdit控件…)。啊!