Перехват сообщений в MFC - Какая разница? - PullRequest
5 голосов
/ 14 октября 2008

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

1 - через карту сообщений:

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

2 - через afx_message:

afx_msg type OnSize(...);

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

Ответы [ 3 ]

12 голосов
/ 14 октября 2008

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

3 голосов
/ 14 октября 2008

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

0 голосов
/ 15 октября 2008

Некоторые сообщения Windows уже обработаны MFC , поэтому в этих случаях вы можете просто добавить метод в производный класс.

Например, класс CWnd (как и многие другие классы MFC) уже отображает несколько сообщений Windows в свою карту сообщений (т. Е. ON_WM_DRAWITEM , ON_WM_MEASUREITEM , ON_WM_ENTERIDLE и т. Д. И т. Д.).

Но для работы любого другого сообщения, еще не отображенного с помощью MFC, должен быть метод класса и запись в карте сообщений.

...