Шаг 288 - Обработка WM_NOTIFY в MFC

Обрабатывает извещения функция CWnd::OnNotify():

virtual BOOL CWnd::OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult );

Эта функция по умолчанию проверяет карту сообщений. Вы ее не отменяйте. В смысле никогда. Но перегрузить ее Вы можете для того, чтобы обрабатывать динамически созданные элементы управления как в "Шаг 255 - Использование Windows Common Controls". Для статических элементов управления Вы можете использовать ClassWizard для формирования макросов обработки. Вот как формируется извещение для TreeView:

288.gif (9806 b)

В карту сообщений будет записан следующий код:

......
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTree1)
......

ON_NOTIFY стандартный макрос обрабоки извещений:

ON_NOTIFY( 
	wNotifyCode,	\\ код сообщения
	id,		\\ идентификатор
	memberFxn		\\ функция обработки
)

Функция обработки должна иметь следующий вид:

afx_msg void memberFxn(
	NMHDR * pNotifyStruct,	// указатель на структуру
	LRESULT * result		// указатель на код возврата
);

Для обработки уведомлений от нескольких элементов одной функции можно использовать ON_NOTIFY_RANGE:

ON_NOTIFY_RANGE(
	wNotifyCode, 
	id,		// первый идентифкатор
	idLast,		// последний идентификатор
	memberFxn 
)

Функция обработки немного поменяется:

afx_msg void memberFxn
( 
	UINT id,	// идентификатор элемента управления
	NMHDR * pNotifyStruct, 
	LRESULT * result 
);

Для обработки сообщения несколькими объектами используется ON_NOTIFY_EX или ON_NOTIFY_EX_RANGE. В данном случае функция должна возвращать BOOL для того, чтобы сообщить надо ли дальше обрабатывать извещение:

ON_NOTIFY_EX( nCode, id, memberFxn )

ON_NOTIFY_EX_RANGE( wNotifyCode, id, idLast, memberFxn )

afx_msg BOOL memberFxn
(
	UINT id, 
	NMHDR * pNotifyStruct, 
	LRESULT * result 
);

Если извещение было полностью обработано, то вернуть надо TRUE, иначе FALSE.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.