关于在 MFC 类中使用控件通知消息的说明





4.00/5 (7投票s)
2002年7月2日

77794
你的控件如何“吃掉”父窗口的消息。
引言
假设我们有一个以通常方式创建的基于组合框的控件(参见 https://codeproject.org.cn/combobox/listboxex.asp 或许多其他类似的 CodeProject 文章)。该控件在对话框中使用,并通过常见的通知消息映射来接收控件活动通知。
ON_CBN_SELCHANGE(IDC_MY_COMBO, OnSelchangeCombo)
一切都很好,直到控件也需要通知时。我们可以毫无问题地映射新的功能,一切都正常工作。
ON_CONTROL_REFLECT(CBN_SELCHANGE, OnSelchange)
从用户的角度来看,选择新的组合框项目会改变实际值,但在点击“确定”后,新的值并没有被使用。 发生了什么?
问题在于识别所做的更改。 因为我们使用 ON_CONTROL_REFLECT
,对话框的 OnSelchangeCombo
没有被调用。
这当然不是系统错误,而是文档化的行为 - 参见 MSDN TN062: Message Reflection for Windows Controls - 并且解决方案很简单:不要使用 ON_NOTIFY_REFLECT()
,而是使用 ON_NOTIFY_REFLECT_EX()
或提供一个更通用的处理程序。 例如
BOOL CMyComboBox::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult) { if(message == WM_COMMAND) { int wNotifyCode = HIWORD(wParam); int wID = LOWORD(wParam); HWND hwndCtl = (HWND) lParam; switch(wNotifyCode) { case CBN_SELCHANGE: //original OnSelchange code call break; } } return CComboBox::OnChildNotify(message, wParam, lParam, pLResult); }
希望阅读这篇文章能帮助你避免类似的情况。