Перехват сообщений от ребенка от ребенка с 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);
    }
}
Другие вопросы по тегам