Перехват сообщений в MFC. В чем разница?
Вопрос
Мне просто интересно, в чем (если таковая имеется) разница между следующими двумя ловушками сообщений в MFC для функции OnSize(..).
1 - Через карту сообщений:
BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
...
ON_WM_SIZE()
..
END_MESSAGE_MAP()
2 – через afx_message:
afx_msg type OnSize(...);
Кажется, они взаимозаменяемы, какой из них следует использовать или это зависит от других факторов?
Решение
Обе части необходимы для добавления обработчика сообщений в класс.Карта сообщений должна быть объявлена внутри вашего класса вместе с объявлениями для любых функций обработчиков сообщений (например, OnSize
).
class CClassWnd : public CBaseClassWnd {
...
afx_msg void OnSize(UINT nType, int cx, int cy);
DECLARE_MESSAGE_MAP
};
afx_msg
это просто пустой макрос-заполнитель. На самом деле он ничего не делает, но всегда включается по соглашению.
Карта сообщений затем определяется в файле .cpp класса:
BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
ON_WM_SIZE()
END_MESSAGE_MAP()
Эти макросы создают таблицу поиска для класса, которая позволяет отправлять сообщения, полученные окном, соответствующим функциям-обработчикам.А ON_WM_SIZE
макрос позволяет wParam
и lParam
параметры сообщения в WM_SIZE
сообщение, которое необходимо декодировать в более значимые значения для функции обработчика сообщений (nType
, cx
, и cy
в этом случае).MFC предоставляет макросы для большинства оконных сообщений (WM_LBUTTONDOWN
, WM_DESTROY
, и т. д).
Вы можете найти дополнительную информацию о том, как работают карты сообщений в MFC. здесь на MSDN.
Другие советы
afx_msg — это просто пустой макрос, он просто предназначен для обозначения того, что метод является обработчиком сообщений MFC для удобства чтения.Даже при наличии afx_msg вам все равно потребуется запись в карте сообщений.
Некоторые сообщения Windows уже обработаны МФЦ, поэтому в этих случаях вам может сойти с рук добавление только метода в производный класс.
Например, CWnd (как и многие другие классы MFC) уже отображает несколько сообщений Windows в свою карту сообщений (т.е. ON_WM_DRAWITEM, ON_WM_MEASUREITEM, ON_WM_ENTERIDLE и т. д. и т. д.).
Но для работы любого другого сообщения, еще не сопоставленного MFC, потребуется как метод класса, так и запись в карте сообщений.