Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 拦截来自MFC子级的子级的消息_C++_Mfc_Clistctrl_Ccombobox - Fatal编程技术网

C++ 拦截来自MFC子级的子级的消息

C++ 拦截来自MFC子级的子级的消息,c++,mfc,clistctrl,ccombobox,C++,Mfc,Clistctrl,Ccombobox,我有一个CListCtrl类,当用户选择其中一个子项时,我会在子项上显示一个cmbobox,用户可以从中进行选择 但是我有一个问题。当用户做出选择时,我需要组合框消失(即intercept CBN_SELCHANGE)。问题是我需要使cmbobox成为CListCtrl的子对象(否则,即使我将组合框设置为最顶端,列表在组合框上方绘制时也会遇到奇怪的问题)。因此CBN_SELCHANGE消息被发送到列表视图,可以理解,该视图会忽略它。如何让列表视图将该消息传递到父窗口 我真的需要派生自己的CLis

我有一个CListCtrl类,当用户选择其中一个子项时,我会在子项上显示一个cmbobox,用户可以从中进行选择

但是我有一个问题。当用户做出选择时,我需要组合框消失(即intercept CBN_SELCHANGE)。问题是我需要使cmbobox成为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()
    {
    };
};

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

您可以将cmbobox子类化,以便它能够处理CBN\U特写消息。 您的自定义组合将了解管理器,即首先创建它的对象,并将在关闭时销毁它(顶级窗口或其他,应作为自定义组合框构造函数的参数提供)。。。 因此,当您在列表项顶部创建combobox时,您将创建此自定义combobox的实例,而不是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);
    }
}

您可以将CComboBox子类化,使其能够处理CBN_特写消息。 您的自定义组合将了解管理器,即首先创建它的对象,并将在关闭时销毁它(顶级窗口或其他,应作为自定义组合框构造函数的参数提供)。。。 因此,当您在列表项顶部创建combobox时,您将创建此自定义combobox的实例,而不是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);
    }
}

虽然这是一个不错的建议,但我最终还是创建了一个自定义类,它在特定情况之外几乎没有用处。此外,当你说子类窗口,我认为你不是说使用子类窗口函数?我在想,如果我能截获消息,是否可以使用窗口的真正子类。遗憾的是,我从来没有让窗口子类化工作过(没有子类化,我的意思只是:-):类CNotifyingComboBox:public cmboboxso唉,我还是回到了原点,即创建一个只在这些特定情况下使用的类。也就是说,你的组合框的优点是我可以覆盖绘图并将其放入列表视图子项:)TBH我正在使用我在OP中放入的方案,但无论如何我都会接受这篇文章:)虽然这不是一个坏建议,但我最终还是创建了一个自定义类,在特定情况之外几乎没有用处。此外,当你说子类窗口,我认为你不是说使用子类窗口函数?我在想,如果我能截获消息,是否可以使用窗口的真正子类。遗憾的是,我从来没有让窗口子类化工作过(没有子类化,我的意思只是:-):类CNotifyingComboBox:public cmboboxso唉,我还是回到了原点,即创建一个只在这些特定情况下使用的类。也就是说,您的组合框的优点是我可以覆盖图形并将其放入列表视图子项:)TBH我正在使用我在OP中输入的方案,但无论如何我都会接受此帖子:)