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