Но при нажатии по колонке, в case LVN_COLUMNCLICK я не попадаю.
Может надо какое другое соообщение перехватывать или я вообще
не правильно всё делаю.
Подскажите пожалуйста.
Здравствуйте GoodWin, Вы писали:
GW>Помогите разобраться, — необходимо обработать нажатие мышкой GW>по заголовку колонки в просмотре списка: GW>class CMyListView: public CListView
GW>Делаю я так:
GW>BOOL CMyListView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) GW>{ GW> NMHDR *nmhdr =(NMHDR*)lParam GW> //char s[200],si[20]; GW> //itoa(nmhdr->code,si,10); GW> //sprintf(s,"Код извещения: %s",si); GW> switch (nmhdr->code) GW> { GW> case LVN_COLUMNCLICK: GW> { GW> AfxMessageBox("Нажатие по колонке"); GW> break; GW> } GW> //default:AfxMessageBox(s); GW> } GW> return CListView::OnNotify(wParam, lParam, pResult); GW>}
GW>Но при нажатии по колонке, в case LVN_COLUMNCLICK я не попадаю. GW>Может надо какое другое соообщение перехватывать или я вообще GW>не правильно всё делаю.
Скорее, вообще все неправильно.
Сообщение WM_NOTIFY посылается списком его родительскому окну. Ты же пытаешься обработать это сообщение в окне самого списка, естественно, оно туда не попадает. То есть надо либо перенести обработчик в родительское окно списка, либо воспользоваться механизмом message reflection (отражение сообщений) в MFC, который переадресует такие сообщения обратно списку.
Подробно механизм message reflection описан в MFC Technical Note TN062: Message Reflection for Windows Controls. Вкратце, нужно в карту сообщений CMyListView вставить запись
Здравствуйте Alex Fedotov, Вы писали:
AF>Скорее, вообще все неправильно.
AF>Сообщение WM_NOTIFY посылается списком его родительскому окну. Ты же пытаешься обработать это сообщение в окне самого списка, естественно, оно туда не попадает. То есть надо либо перенести обработчик в родительское окно списка, либо воспользоваться механизмом message reflection (отражение сообщений) в MFC, который переадресует такие сообщения обратно списку.
AF>Подробно механизм message reflection описан в MFC Technical Note TN062: Message Reflection for Windows Controls. Вкратце, нужно в карту сообщений CMyListView вставить запись
AF>ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
AF>и добавить обработчик OnColumnClick:
AF>afx_msg void OnColumnClick(NMHDR * pNMHDR, LRESULT * pResult);
AF>Успехов,
Спасибо большое, оба варианта попробовал, всё работает.
Можно тогда ещё вопрос? :)
А если при обработке в родительском окне нажатия
по колонке надо убедиться, что сообщение пришло от именно этого просмотра списка,
то надо сравнить nmhdr->hwndFrom c хэндолм этого списка. А как мне хэндл этого
списка передать родительскому окну (CFrameWnd)?
Здравствуйте Аноним, Вы писали:
А>А если при обработке в родительском окне нажатия А>по колонке надо убедиться, что сообщение пришло от именно этого просмотра списка, А>то надо сравнить nmhdr->hwndFrom c хэндолм этого списка. А как мне хэндл этого А>списка передать родительскому окну (CFrameWnd)?
Честно говоря, не совсем понял вопрос. Как передать? Любым удобным способом
Здравствуйте Аноним, Вы писали:
А>А если при обработке в родительском окне нажатия А>по колонке надо убедиться, что сообщение пришло от именно этого просмотра списка, А>то надо сравнить nmhdr->hwndFrom c хэндолм этого списка.
Начнем с того, что надо ли в этом убеждаться? Если юзер ткнул в колонку, значит данное окно вида будет активным. Родительское окно может воспользоваться GetActiveView() и дальше уже из вида вытащить любую необходимую информацию.
Если под "просмотром списка" ты понимаешь не view, а что-то другое — тогда уточни терминологию.
А>А как мне хэндл этого А>списка передать родительскому окну (CFrameWnd)?
А как из объекта одного класса передать значение в объект другого класса? Присваиванием значения соответствующей пременной класса.