Вопрос

Мне просто интересно, в чем (если таковая имеется) разница между следующими двумя ловушками сообщений в 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, потребуется как метод класса, так и запись в карте сообщений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top