簡體   English   中英

使用MFC攔截來自一個孩子的消息

[英]Intercepting messages from a child of a child with MFC

我有一個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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM