Windows’95 и Windows NT, Сходства и различия, страница 2

Поток, который желает реагировать на события, происходящие в ОС должен иметь в своем составе «цикл обработки сообщений»:

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 для остальных файлов.)