使用MFC拦截来自孩子的孩子的消息

时间:2009-11-10 16:09:27

标签: c++ mfc clistctrl ccombobox

我有一个CListCtrl类,当用户选择其中一个子项时,我在子项目上显示CComboBox,然后用户可以从中选择。

但是我有问题。当用户做出选择时,我需要组合框消失(即拦截CBN_SELCHANGE)。问题是我需要让CComboBox成为CListCtrl的子代(否则我会在组合框上绘制列表时遇到奇怪的问题,即使我将组合框设置为最顶层)。因此,CBN_SELCHANGE消息被发送到列表视图,可以理解,忽略它。如何获取列表视图以将该消息传递到父窗口。

我是否真的需要派生自己的CListCtrl类,它只是拦截CBN_SELCHANGE消息并将其传递给父窗口?有没有比创建OnWndMsg处理程序更好的方法呢?

感谢您的帮助!

编辑:此代码有效

class CPassThroughListCtrl : public CListCtrl
{
protected:
    virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
        if ( message == WM_COMMAND )
        {
            GetParent()->SendMessage( message, wParam, lParam );
        }
        return CListCtrl::OnWndMsg( message, wParam, lParam, pResult );
    }
public:
    CPassThroughListCtrl()
    {
    };
};

但我真的很想知道是否有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

您可以将CComboBox子类化,以便它将处理CBN_CLOSEUP消息。 你的自定义组合将知道管理器,即首先创建它的对象,并且必须在关闭时销毁它(顶级窗口或其他任何东西,应作为自定义组合框构造函数的参数提供)... 因此,当您在列表项的顶部创建组合框时,您将创建此自定义组合框的实例,而不是MFC默认组合框。 Combobox事件处理程序可能如下所示:

BEGIN_MESSAGE_MAP(CNotifyingComboBox, CComboBox)
 ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseUp)
END_MESSAGE_MAP()

void CNotifyingComboBox::OnCloseUp()
{
    // _manager is pointer to the object that created this combobox, 
    // and is responsible for its destruction, 
    // should be passed into CNotifyingComboBox cosntructor
    if( NULL != _manager )
    {
        _manager->OnCloseUpComboBox(this);
    }
}