2009-11-10 107 views
1

我有一個CListCtrl類,並且當用戶選擇其中一個子項目時,我正在用戶可以從中進行選擇的子項目上顯示CComboBox。從MFC的孩子的孩子截取消息

但是我有一個問題。當用戶做出選擇時,我需要組合框消失(即攔截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() 
    { 
    }; 
}; 

但我很想知道是否有這樣做一個更好的方式。

回答

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

雖然它不是一個壞的建議,我還是最終創建出具有的特殊情況外很少使用的自定義類。此外,當你說子類的窗口,我認爲它不意味着使用SubclassWindow函數?如果我能截取信息,我還會想知道是否使用真正的窗口子集。恥辱我neer得到了窗口子類化工作( – Goz

+0

否通過繼承我的意思不超過這個:-):類CNotifyingComboBox:公共CComboBox – BostonLogan

+0

因此,我仍然回到原點之一,即創建一個類是僅在這些特定情況下使用。這就是說你的組合框的優點是我可以重寫圖形,並將其納入列表視圖子項:) – Goz