Перехват сообщений от ребенка от ребенка с MFC - PullRequest
1 голос
/ 10 ноября 2009

У меня есть класс 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 Ответ

1 голос
/ 12 ноября 2009

Вы можете создать подкласс 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);
    }
}
...