Перехват сообщений от дочернего элемента дочернего элемента с MFC

StackOverflow https://stackoverflow.com/questions/1709093

  •  19-09-2019
  •  | 
  •  

Вопрос

У меня есть класс 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);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top