[英]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.