【问题标题】:Intercepting messages from a child of a child with MFC使用 MFC 拦截来自孩子的孩子的消息
【发布时间】:2009-11-10 16:09:27
【问题描述】:

我有一个 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()
    {
    };
};

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

【问题讨论】:

    标签: c++ mfc clistctrl ccombobox


    【解决方案1】:

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

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

    【讨论】:

    • 虽然这是一个不错的建议,但我仍然最终创建了一个在特定情况之外几乎没有用处的自定义类。此外,当您说 Subclass the window 我接受它时,您不是说使用 SubclassWindow 函数吗?如果我可以截获消息,我想知道是否使用真正的窗口子类化。可惜我没有让窗口子类工作(
    • 没有子类化我的意思不超过这个:-) : class CNotifyingComboBox : public CComboBox
    • 所以,唉,我还是回到了原点,即创建一个只在这些特定情况下使用的类。也就是说,您的组合框的优点是我可以覆盖绘图并将其放入列表视图子项中:)
    • TBH 我正在使用我在我的 OP 中放入的方案,但无论如何我都会接受这篇文章:)
    猜你喜欢
    • 2015-08-27
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    相关资源
    最近更新 更多