Таблицы сообщений класса CLookDlg
Первые две макрокоманды, таблицы сообщений класса CLookDlg, присутствуют во всех приложениях, имеющих пользовательский интерфейс на основе диалоговой панели. Макрокоманды ON_WM_PAINT и ON_WM_QUERYDRAGICON выполняют обработку сообщений WM_PAINT и WM_QUERYDRAGICON, вызывая для этого методы OnSysCommand, OnPaint и OnQueryDragIcon.
Следующая макрокоманда ON_CBN_SELCHANGE обрабатывает сообщение от списка IDC_COMBO_ADDRESS, которое передается когда пользователь выбирает из него строку.
Последующие пять макрокоманд ON_BN_CLICKED вызывают обработчики сообщений от кнопок IDC_BUTTON_REFRESH, IDC_BUTTON_STOP, IDC_BUTTON_BACK, IDC_BUTTON_NEXT и IDC_NAVIGATE, когда пользователь нажимает на них:
BEGIN_MESSAGE_MAP(CLookDlg, CDialog)
//{{AFX_MSG_MAP(CLookDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_CBN_SELCHANGE(IDC_COMBO_ADDRESS,
OnSelchangeComboAddress)
ON_BN_CLICKED(IDC_BUTTON_REFRESH, OnButtonRefresh)
ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
ON_BN_CLICKED(IDC_BUTTON_BACK, OnButtonBack)
ON_BN_CLICKED(IDC_BUTTON_NEXT, OnButtonNext)
ON_BN_CLICKED(IDC_NAVIGATE, OnNavigate)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
Таблица сообщений класса CLookDlg, выделенная в блоке BEGIN_MESSAGE_MAP, не содержит в себе ничего необычного, за исключением того, что в ней отсутствуют обработчики сообщений навигатора. Несмотря на то что мы использовали MFC ClassWizard для переопределения ряда методов навигатора, это не нашло никакого отражения в таблице сообщений.
Однако не спешите думать, что в наше приложение закрались какая-то ошибка. Просмотрите файл LookDlg.cpp до конца. Вы обнаружите еще одну таблицу сообщений, обозначенную макрокомандами BEGIN_EVENTSINK_MAP. Эта таблица также относится к классу CLookDlg, наследованному от базового класса CDialog, как это указано в заголовке таблицы:
BEGIN_EVENTSINK_MAP(CLookDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CLookDlg)
ON_EVENT(CLookDlg, IDC_EXPLORER, 106 /* DownloadBegin */,
OnDownloadBeginExplorer, VTS_NONE)
ON_EVENT(CLookDlg,IDC_EXPLORER, 104 /* DownloadComplete */,
OnDownloadCompleteExplorer, VTS_NONE)
ON_EVENT(CLookDlg, IDC_EXPLORER, 108 /* ProgressChange */,
OnProgressChangeExplorer, VTS_I4 VTS_I4)
ON_EVENT(CLookDlg, IDC_EXPLORER, 100 /* BeforeNavigate */,
OnBeforeNavigateExplorer, VTS_BSTR VTS_I4 VTS_BSTR
VTS_PVARIANT VTS_BSTR VTS_PBOOL)
ON_EVENT(CLookDlg,IDC_EXPLORER,200 /*FrameBeforeNavigate*/,
OnFrameBeforeNavigateExplorer, VTS_BSTR VTS_I4 VTS_BSTR
VTS_PVARIANT VTS_BSTR VTS_PBOOL)
ON_EVENT(CLookDlg, IDC_EXPLORER, 113 /* TitleChange */,
OnTitleChangeExplorer, VTS_BSTR)
ON_EVENT(CLookDlg, IDC_EXPLORER, 103 /* Quit */,
OnQuitExplorer, VTS_PBOOL)
ON_EVENT(CLookDlg,IDC_EXPLORER, 102 /* StatusTextChange */,
OnStatusTextChangeExplorer, VTS_BSTR)
ON_EVENT(CLookDlg, IDC_EXPLORER, 101 /*NavigateComplete */,
OnNavigateCompleteExplorer, VTS_BSTR)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
Все макрокоманды ON_EVENT в этой таблице сообщений обрабатывают сообщения от навигатора IDC_EXPLORER. Макрокоманда ON_EVENT имеет пять параметров.
Первый параметр определяет имя класса которому принадлежит таблица сообщений. В данном случае все сообщения органа управления обрабатываются классом CLookDlg, которому и принадлежит таблица сообщений AFX_EVENTSINK_MAP.
Второй параметр определяет идентификатор органа управления сообщения от которого обрабатываются. В главной диалоговой панели нашего приложения есть только один орган управления ActiveX, сообщения которого обрабатываются - это навигатор IDC_EXPLORER.
Третий параметр содержит идентификатор метода, который перехватывается данной макрокомандой. Данный идентификатор представляет собой целое число, однозначно определяющее сообщение органа управления. MFC ClassWizard вставляет после этого идентификатора комментарий с именем соответствующего метода.
Имя метода, который определен в нашем приложении и вызывается для обработки данного сообщения, указывается в четвертом параметре макрокоманды. По умолчанию эти имена присваиваются MFC ClassWizard на основе имени сообщения.
И, наконец, последний пятый параметр макрокоманды определяет типы параметров метода обработчика. В качестве этого параметра может фигурировать один или несколько идентификаторов VTS_, разделенных символами пробела.
Описание идентификаторов VTS_ вы можете найти в документации Microsoft Visual C++. Сейчас мы опишем только те идентификаторы, которые фигурируют в таблице сообщений приложения:
Идентификатор |
Тип параметра |
VTS_I4 |
long |
VTS_BSTR |
const char* |
VTS_PVARIANT |
VARIANT* |
VTS_PBOOL |
BOOL FAR* |
VTS_NONE |
Параметры отсутствуют |