Главная » Win32 API » Сообщения и их структура

0

Программирование в Windows основывается на использовании ин­терфейса прикладного программирования API (Application Program Interface). API предоставляют программисту набор готовых классов, функций, структур и констант. Их количество составляет около двух тысяч. API-функции обеспечивают взаимодействие приложения с внешними устройствами и ресурсами операционной системы.

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

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

Отличительным признаком сообщения является его код, который для системных сообщений лежит в диапазоне от 1 до 0x3FF. Так как с кодами работать в программе неудобно, то каждому коду сопоставля­ется своя символическая константа, по имени которой можно опреде­лить источник сообщения. Например, при перемещении мыши возни­кает сообщение WMMOUSEMOVE (код 0x200), при нажатии на ле­вую кнопку мыши сообщение WMLBUTTONDOWN (код 0x201). При перерисовке окно получает сообщение WMPAINT. Эти события относятся к классу аппаратных, поскольку в их обработке участвуют драйверы внешних устройств. Например, при нажатии клавиши драй­вер клавиатуры формирует пакет данных и пересылает его в форме со­общения в системную очередь сообщений Windows. Рассмотрим даль­нейшую судьбу сообщения.

Для 32-разрядных приложений время для выполнения распределя­ется между потоками приложения, как минимум, приложение создает один поток. Для каждого потока создается своя очередь сообщений, которая не имеет фиксированного размера. Сообщения из системной очереди распределяются между очередями сообщений потоков, откуда затем извлекаются приложением с помощью функции GetMessageOВозникает вопрос, в какую очередь потока направляется сообщение из системной очереди? Предположим, что на экране много окон приложений и возникло событие, инициированное мышью. В этом случае сообщение от мыши будет адресованы потоку-владельцу окна, над ко­торым находится курсор, т.к. при помощи мыши логично активизиро­вать именно действия, связанные с текущим окном. А значит, сообще­ния от мыши ставятся в очередь потока, активизировавшего текущее окно.

Источниками сообщений, помимо устройств, могут быть приклад­ные программы или ОС. Если сообщение создается в прикладной про­грамме и посылается в Windows, чтобы ОС выполнила требуемые дей­ствия, то такое сообщение имеет код, превышающий 0x3FF. Програм­мист может также предусмотреть собственные сообщения и направ­лять их в различные окна приложения для оповещения о различных ситуациях в вычислительной системе.

Рассмотрим структуру одного сообщения. Сообщения передаются в приложение с помощью специальной структуры MSG, включающей 6 полей, и описанной в файле winuser.h. Так как язык программирования практически не влияет на общую структуру Windows-приложения, рассмотрим реализацию на С. Поля структуры MSG:

{

HWND hwnd;  // Дескриптор окна, которому адресовано // сообщение

UINT message;  // Код данного сообщения

WPARAM wParam; // Доп. информация

LPARAM IParam; // Доп. информация

DWORD time;    // Время отправления сообщения

POINT pt; // Позиция курсора мыши на момент // отправления сообщения

} MSG;

Все объекты (окна, файлы, процессы, потоки, события и т.д.) и сис­темные ресурсы в Windows описываются с помощью дескрипторов. Различают, например, дескрипторы экземпляров приложений (Handle of Instance, HInstance), окон (HWND), пиктограмм (HIcon), шриф-TOB(HFont), перьев (HPen) и т.д. Определения этих дескрипторов дос­тупны при подключении Windows.h, который ссылается на Windef.h. Так как сообщение посылается определенному окну, то его дескриптор указывается в структуре сообщения. Поля wParam и IParam содержат дополнительные данные, необходимые для обработки сообщения, их содержимое различается для сообщений каждого типа. Например, для сообщения WMMOUSEMOVE поле wParam содержит информацию о состоянии клавиш мыши (нажаты или отпущены), а также о состоя­нии клавиш Ctrl и Shift, а поле IParam содержит позицию курсора от­носительно начала клиентской области окна в отличие от поля pt, coдержащего позицию курсора мыши относительно границ экрана (ри­сунок 1.1).

ГПуск||ОКН01                                                                                                                                                              | 12:53

Рисунок 1.1Окно с минимальным набором элементов управления

Отметим, что приложение может обрабатывать не все сообщения, часть из них обрабатываются самой ОС либо до попадания сообщения в очередь потока, либо после извлечения сообщения из очереди и «осознания», что приложение сообщение данного типа не интересует. Рассмотрим первый из этих случаев. Например, если щелкнуть левой кнопкой мыши на пункте меню, то вместо сообщения WMLBUTTONDOWN формируется сообщение WMCOMMAND, параметры которого содержат идентификатор пункта меню, над кото­рым был курсор мыши в момент щелчка. Это избавляет приложение от необходимости анализа положения курсора мыши при оценке, попада­ет ли курсов в прямоугольную область, соответствующую пункту ме­ню.

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

можно определить тип переменной. Эти символы называются префик­сом. Так, префикс sz (String Zero) означает символьную строку, закан­чивающуюся двоичным нулем, с (Char) символ, dw (Double Word) -32 битная переменная, lpsz (Long Pointer of String Zero)дальний (на самом деле ближний!) указатель на символьную строку, заканчиваю­щуюся двоичным нулем, h (Handle) дескриптор (описатель) объекта, содержащий информацию об объекте.

Сообщения от Windows имеют префикс WM_, префикс ВМ_ соот­ветствует сообщениям от кнопок, префикс ЕМ_ сообщениям от тек­стовых полей редактирования (EditBox), LB_ сообщениям от спи­сков.

Источник: Сучкова, Л.И. Win32 API: основы программирования: учебное пособие/ Л.И. Сучкова; АлтГТУ им. ИИ. Ползунова. -Барнаул, АлтГТУ, 2010. 138 с, ил.

По теме:

  • Комментарии