Разработка приложений для Internet

       

Таблицы сообщений класса 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
Параметры отсутствуют
Содержание раздела