Поток, который желает реагировать на события, происходящие в ОС должен иметь в своем составе «цикл обработки сообщений»:
while (GetMessage(&msg,0,0,0))
DispatchMessage(&msg);
Функция GetMessage предназначена для выборки из очереди сообщений потока очередного сообщения. Функция DispatchMessage – для передачи этого сообщения окну, закрепленному за потоком, которому предназначено сообщение.
Кроме этих основных функций в цикл сообщений может быть включена функция TranslateMessage – для обработки клавиатурных сообщений. И функция TranslateAccelerator – для обработки таблиц акселераторных клавиш, если таковые есть в меню окна потока.
Ничто не мешает программисту создавать в одном потоке несколько циклов обработки сообщений, однако все они будут производить выборку сообщений из одной и той же очереди.
Типы сообщений
Существует много разновидностей сообщений, представляющих события на разных уровнях. C помощью приложения Spy++ можно оценить сложное множество сообщений, обрабатываемых каждым отдельным окном. Используйте Spy++ для выделения какого-то простого элемента, например, диалогового окна, чтобы перехватить его сообщения; вы увидите кажущийся бесконечным поток сообщений в окне Spy++, как только переместите указатель мыши на кнопку диалогового окна и щелкните на ней. В табл. содержится список сообщений, появляющийся при щелчке на кнопке ОК в диалоговом окне About в текстовом редакторе Word for Windows.
Идентификатор |
Описание |
WM_LBUTTONDOWN |
Левая кнопка мыши нажата. |
WM_PAINT |
Кнопка ОК представлена как нажатая. |
WM_LBOTTONOP |
Левая кнопка мыши отпущена. |
WM_PAINT |
Кнопка ОК перерисовывается как отжатая. |
WM_WINDOWPOSCHANGING |
Подготовка к изменению положения окна. |
WM_HINDOWPOSCHANGED |
Позиция окна изменилась. |
WM_JTCACTIVATE |
Область заголовка окна активизирована. |
WM_ACTIVATE |
Клиентская область окна активизирована. |
WM_WINDOWPOSCHANGING |
Подготовка к изменению положения окна. |
WM_KILLFOCUS |
Подготовка окна к потере фокуса. |
WM_DESTROY |
Удаление окна. |
WM_NCDESTROY |
Удаление области заголовка окна. |
Как видно, сообщения представляются каждым простым событием, каждое простое действие посылается окну для обработки. К счастью, приложение не должно заботиться о смысле каждого отдельного сообщения. Вместо обработки всех возможных сообщений приложение имеет свободу выбора; необработанные сообщения передаются в функции обработки сообщений операционной системы по умолчанию.
Сообщение Windows состоит из нескольких частей. Возможно, лучше познакомиться со структуройMSG, показанной в листинге, которая используется для представления сообщений:
typedef struct tagMSG ( HWND hwnd ;
UINT message;
WPARAM wParam;
LPARAM IParam;
DWORD time ;
POINT pt ;
) MSG;
Первый элемент этой структуры —hwnd — однозначно идентифицирует окно, которому посылается это сообщение. Каждое окно в Windows имеет такой идентификатор.
Следующий элемент идентифицирует само сообщение. Этот элемент может иметь сотни различных значений, означающих одно из многих сотен (буквально!) различных сообщений, которые могут получать приложения Windows. Сообщения можно разделить на несколько групп в зависимости от их функций. Для идентификаторов сообщений обычно используются символьные (WM_PAINT, WM_TIMER), а не числовые значения; эти символьные значения определены в стандартных файлах заголовков Windows. (Необходимо только включить файлwindows.h, а он, в свою очередь, содержит директивы #include для остальных файлов.)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.