65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (7投票s)

2002年7月2日

viewsIcon

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);
}

希望阅读这篇文章能帮助你避免类似的情况。

© . All rights reserved.