1

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

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

4

1 回答 1

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);
    }
}
于 2009-11-12T20:28:41.357 回答