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

但我很想知道是否有这样做一个更好的方式。

有帮助吗?

解决方案

您可以继承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);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top