Захват сообщений в MFC - в чем разница?

Мне просто было интересно, какая (если есть) разница между следующими двумя ловушками сообщений в MFC для функции OnSize (..).

1 - С помощью карты сообщений:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
...
    ON_WM_SIZE()
..
END_MESSAGE_MAP()

2 - Через afx_message:

afx_msg type OnSize(...);

Кажется, что они взаимозаменяемы, какой из них следует использовать или это зависит от других факторов?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
2 400
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

afx_msg - это просто пустой макрос, он в основном предназначен для обозначения того, что метод является обработчиком сообщений MFC для удобства чтения. Даже с afx_msg вам все равно нужно иметь запись в карте сообщений.

Приятно это знать, о чем я задумывался некоторое время. Может, у меня просто слишком много свободного времени ...;)

SmacL 14.10.2008 19:22
Ответ принят как подходящий

Обе части необходимы для добавления в класс обработчика сообщений. Карта сообщений должна быть объявлена ​​внутри вашего класса вместе с объявлениями для любых функций обработчика сообщений (например, 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, должно иметь как метод класса, так и запись в карте сообщений, чтобы оно работало.

Другие вопросы по теме