Мне просто было интересно, какая (если есть) разница между следующими двумя ловушками сообщений в MFC для функции OnSize (..).
BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
...
ON_WM_SIZE()
..
END_MESSAGE_MAP()
afx_msg type OnSize(...);
Кажется, что они взаимозаменяемы, какой из них следует использовать или это зависит от других факторов?





afx_msg - это просто пустой макрос, он в основном предназначен для обозначения того, что метод является обработчиком сообщений MFC для удобства чтения. Даже с afx_msg вам все равно нужно иметь запись в карте сообщений.
Обе части необходимы для добавления в класс обработчика сообщений. Карта сообщений должна быть объявлена внутри вашего класса вместе с объявлениями для любых функций обработчика сообщений (например, 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.
Некоторые сообщения Windows уже обрабатываются MFC, поэтому в этих случаях вы можете уйти, добавив только метод в производный класс.
Например, класс CWnd (как и многие другие классы MFC) уже отображает несколько сообщений Windows в свою карту сообщений (т.е. ON_WM_DRAWITEM, ON_WM_MEASUREITEM, ON_WM_ENTERIDLE и т. д.).
Но любое другое сообщение, еще не отображенное MFC, должно иметь как метод класса, так и запись в карте сообщений, чтобы оно работало.
Приятно это знать, о чем я задумывался некоторое время. Может, у меня просто слишком много свободного времени ...;)