Макрокоманда ON_WM_<name>
Обрабатывает стандартные сообщения операционной системы Windows. Вместо <name> указывается имя сообщения без префикса WM_. Так, например для обработки сообщения WM_SIZE предназначена макрокоманда ON_WM_SIZE.
Для обработки сообщений, определенных в таблице сообщений макрокомандами ON_WM_<name>, вызываются одноименные методы. Имя метода обработчика соответствует названию сообщения, без учета префикса WM_.
В классе CWnd определены обработчики для стандартных сообщений. Эти обработчики будут использоваться по умолчанию. Вот некоторые из таких методов.
Сообщение | Макрокоманда | Метод обработчик | |||
WM_CHAR | ON_WM_CHAR() | afx_msg void
OnChar(UINT, UINT, UINT); | |||
WM_CREATE | ON_WM_CREATE() | afx_msg int
OnCreate(LPCREATESTRUCT ); | |||
WM_HSCROLL | ON_WM_HSCROLL() | afx_msg void
OnHScroll(UINT, UINT, CWnd*); | |||
WM_KEYDOWN | ON_WM_KEYDOWN() | afx_msg void
OnKeyDown(UINT, UINT, UINT); | |||
WM_KEYUP | ON_WM_KEYUP() | afx_msg void
OnKeyUp(UINT, UINT, UINT); | |||
WM_LBUTTONDOWN | ON_WM_LBUTTONDOWN() | afx_msg void
OnLButtonDown(UINT, CPoint); | |||
WM_LBUTTONUP | ON_WM_LBUTTONUP() | afx_msg void
OnLButtonUp(UINT, CPoint); | |||
WM_PAINT | ON_WM_PAINT() | afx_msg void
OnPaint(); | |||
WM_SIZE | ON_WM_SIZE() | afx_msg void
OnSize(UINT, int, int); | |||
WM_TIMER | ON_WM_TIMER() | afx_msg void
OnTimer(UINT); | |||
WM_VSCROLL | ON_WM_VSCROLL() | afx_msg void
OnVScroll(UINT, UINT, CWnd*); |
Все методы-обработчики определены с ключевым словом afx_msg. Оно позволяет отличить эти методы от остальных методов класса. На этапе препроцессорной обработки ключевое слово afx_msg удаляется. Определение afx_msg вы можете найти в файле afxwin.h:
#define afx_msg
Макрокоманды ON_WM_<name> не имеют параметров. Однако методы, которые вызываются для обработки соответствующих сообщений, имеют параметры, количество и назначение которых зависит от обрабатываемого сообщения.
Когда вы определяете обработчик стандартного сообщения Windows в своем классе, он будет использоваться вместо обработчика определенного в классе CWnd (или другом базовом классе). В любом случае вы можете вызвать метод обработчик базового класса из своего метода обработчика.