Перехват сообщений от ребенка от ребенка с 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()
{
};
};
Но мне бы очень хотелось узнать, есть ли лучший способ сделать это.
1 ответ
Вы можете создать подкласс CComboBox так, чтобы он обрабатывал сообщение CBN_CLOSEUP. Ваша пользовательская комбинация будет знать о менеджере, т.е. об объекте, который его создал в первую очередь, и должна будет уничтожить его при закрытии (окно верхнего уровня или что-то еще, должно быть предоставлено в качестве аргумента для вашего собственного конструктора комбинированного списка)... когда вы создаете комбинированный список в верхней части элемента списка, вы создаете экземпляр этого настраиваемого комбинированного списка вместо стандартного MFC. Обработчик события Combobox может выглядеть так:
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);
}
}