Нажатие по CListView
От: GoodWin  
Дата: 15.12.01 06:13
Оценка:
Помогите разобраться, — необходимо обработать нажатие мышкой
по заголовку колонки в просмотре списка:
class CMyListView: public CListView

Делаю я так:

BOOL CMyListView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHDR *nmhdr =(NMHDR*)lParam
//char s[200],si[20];
//itoa(nmhdr->code,si,10);
//sprintf(s,"Код извещения: %s",si);
switch (nmhdr->code)
{
case LVN_COLUMNCLICK:
{
AfxMessageBox("Нажатие по колонке");
break;
}
//default:AfxMessageBox(s);
}
return CListView::OnNotify(wParam, lParam, pResult);
}

Но при нажатии по колонке, в case LVN_COLUMNCLICK я не попадаю.
Может надо какое другое соообщение перехватывать или я вообще
не правильно всё делаю.
Подскажите пожалуйста.
Re: Нажатие по CListView
От: Alex Fedotov США  
Дата: 15.12.01 06:32
Оценка: 6 (2)
Здравствуйте 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 вставить запись

ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)

и добавить обработчик OnColumnClick:

afx_msg void OnColumnClick(NMHDR * pNMHDR, LRESULT * pResult);

Успехов,
-- Alex Fedotov
Re[2]: Нажатие по CListView
От: Аноним  
Дата: 15.12.01 08:15
Оценка:
Здравствуйте 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)?
Re[3]: Нажатие по CListView
От: Alex Fedotov США  
Дата: 15.12.01 09:32
Оценка:
Здравствуйте Аноним, Вы писали:

А>А если при обработке в родительском окне нажатия

А>по колонке надо убедиться, что сообщение пришло от именно этого просмотра списка,
А>то надо сравнить nmhdr->hwndFrom c хэндолм этого списка. А как мне хэндл этого
А>списка передать родительскому окну (CFrameWnd)?

Честно говоря, не совсем понял вопрос. Как передать? Любым удобным способом
-- Alex Fedotov
Re[3]: Нажатие по CListView
От: Игорь Вартанов Ниоткуда  
Дата: 15.12.01 11:23
Оценка:
Здравствуйте Аноним, Вы писали:

А>А если при обработке в родительском окне нажатия

А>по колонке надо убедиться, что сообщение пришло от именно этого просмотра списка,
А>то надо сравнить nmhdr->hwndFrom c хэндолм этого списка.

Начнем с того, что надо ли в этом убеждаться? Если юзер ткнул в колонку, значит данное окно вида будет активным. Родительское окно может воспользоваться GetActiveView() и дальше уже из вида вытащить любую необходимую информацию.

Если под "просмотром списка" ты понимаешь не view, а что-то другое — тогда уточни терминологию.

А>А как мне хэндл этого

А>списка передать родительскому окну (CFrameWnd)?

А как из объекта одного класса передать значение в объект другого класса? Присваиванием значения соответствующей пременной класса.
---
С уважением,
Игорь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.