Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции-ТРПС.doc
Скачиваний:
13
Добавлен:
15.11.2018
Размер:
810.5 Кб
Скачать

5.2.7. Типы сообщений

Существует много разновидностей сообщений, представляющих Windows события на разных уровнях. Каждое простое событие, каждое простое действие посылается в виде сообщения окну для обработки. Приложению приходит множество сообщений, однако приложение не должно заботиться о смысле каждого отдельного сообщения. Вместо обработки всех возможных сообщений приложение имеет свободу выбора, так как необработанные сообщения передаются назад в Windows для обработки по умолчанию самой операционной системой.

Все Windows сообщение состоят из нескольких частей и представляются структурой MSG:

typedef struct tagMSG { HWND hwnd; // дескриптор окна UINT message; // значение самого сообщения WPARAM wParam; // параметр сообщения LPARAM lParam; // параметр сообщения DWORD time; // время наступления события POINT pt; // точка, где произошло событие } MSG;

Элемент структуры hwnd однозначно идентифицирует окно, которому посылается это сообщение. Каждое окно в Windows имеет уникальный идентификатор.

Элемент message идентифицирует само сообщение. Этот элемент принимает любое значение из допустимого диапазона, который описывает Windows сообщения. Для Windows сообщений обычно используются символьные представления, такие как WM_PAINT, WM_TIMER, а не конкретные числовые значения. Эти символьные значения определены в стандартных файлах заголовков Windows. Обычно приложению необходимо включить в свой исходный текст только файл windows.h, он содержит директивы #include для всех остальных файлов.

Сообщения можно разделить на несколько групп в зависимости от их смысловой нагрузки. Самой насыщенной группой сообщений является группа сообщений управления окнами. Символьные идентификаторы для этих сообщений начинаются с WM_. Эта группа настолько велика, что ее обычно разбивают на категории. Эти категории включают:

  • сообщения DDE (dynamic data exchange);

  • сообщения буфера обмена;

  • сообщения мыши;

  • сообщения клавиатуры;

  • сообщения неклиентской (non-client) области окна;

  • сообщения MDI (multiple-document interface);

и некоторые другие.

Перечисленные категории несколько неточны и не всегда строго определены. Они просто служат для удобства программистов, чтобы можно было представить картину множества событий управления окнами. Множество сообщений WM_ также не фиксировано, оно растет по мере добавления новых возможностей операционной системы.

Другие группы сообщений связаны с определенными типами окон. Существуют сообщения, определенные для полей ввода, кнопок, списков, комбинированных списков, полос прокрутки, элементов просмотра списка деревьев и так далее.

Приложения могут определять собственные сообщения, что можно сделать двумя способами. Первый способ пригоден только для случая, если сообщение пересылается между окнами одного и того же приложения. Для этого необходимо определить символическое имя нового сообщения при помощи директивы #define, например:

#define UserMessage1 (WM_USER+100) #define UserMessage2 (WM_USER+101)

Вторым способом определения собственного сообщения является использование функции RegisterWindowMessage(), которая возвращает уникальный идентификатор для сообщения. Использование собственных типов сообщений, полученных таким способом, позволяет частям приложения связываться между собой. Более того, разные приложения могут обмениваться информацией посредством такого идентификатора сообщения.

В Win16 взаимодействующие приложения могли обмениваться данными, пересылая друг другу дескрипторы глобальных блоков памяти. В Win32 этот механизм не работает, так как все приложения имеют собственные адресные пространства, которые не перекрываются. Для взаимодействия приложений в Win32 доступны более мощные механизмы, например, отображаемые в память файлы.