- •2.3. Цикл сообщений 15
- •2.4. Функция окна 16
- •1. Концепция программирования под Windows. Основные понятия
- •1.1. Программная среда Windows
- •1.2. Интерфейс вызовов функций в Windows
- •1.3. Библиотеки динамической загрузки
- •1.5. Интерфейс gdi
- •1.6. Многозадачность в Windows
- •1.7. Взаимодействие программ и Windows
- •1.8. Основы программирования под Windows
- •1.8.1.Функция WinMain()
- •1.8.2. Функция окна
- •1.8.3. Цикл сообщений
- •1.8.4. Класс окна
- •1.8.5. Специфика программ для Windows
- •1.8.6. Типы данных в Windows
- •1.8.7. Соглашение об использовании имен
- •1 Вертикальная полоса прокрутки .9. Элементы окна
- •2. Каркас программы под Windows. Создание окна
- •2.1. Каркас программы для Windows 95
- •2.1. Определение класса окна
- •2.2. Создание окна
- •2.3. Цикл сообщений
- •2.4. Функция окна
- •3. Порядок выполнения работы
2.3. Цикл сообщений
В конце функции WinMain() расположен цикл сообщений. Он является неотъемлемой частью всех приложений Windows и предназначен для принятия и обработки сообщений, посылаемых Windows 95. Когда приложение выполняется, ему непрерывно посылаются сообщения. Они хранятся в очереди сообщений приложения до тех пор, пока не будут прочитаны и обработаны. Каждый раз, когда приложение собирается прочесть очередное сообщение, оно должно вызвать API-функцию GetMessage(), которая имеет такой прототип:
BOOL GetMessage (LPMSG msg, HWND hwnd, UINT min, UINT max) ;
Информация, связанная с сообщением, будет записана в структуру, на которую Указывает параметр msg. Все сообщения, посылаемые окнам, представляются в виде структуры типа MSG, которая определена следующим образом:
HWND hwnd; /* дескриптор окна, которому послано сообщение */
UINT message; /* идентификатор сообщения */
WPARAM wParam; /* информация, зависящая от сообщения */
LPARAM IParam; /* дополнительная информация */
DWORD time; /* время, когда было послано сообщение */
POINT pt; /* координаты курсора мыши */
} MSG;
Дескриптор окна, которому послано сообщение, содержится в поле hwnd. В Windows 95 каждое сообщение представляется 32-разрядным числом, записываемым
в поле message. Дополнительная информация, связанная с сообщением, указывается
в полях wParam и lParam. Тип WPARAM определен с помощью typedef-декларации
как UINT, а тип LPARAM — как LONG.
Время, когда было послано сообщение, задается в миллисекундах в поле time. В поле pt содержатся координаты курсора мыши на момент передачи сообщения.
Координаты записываются в структуру типа POINT, которая определена следующим образом:
typedef struct tagPOINT {
LONG x,y; } POINT;
Если очередь сообщений приложения пуста, то вызов функции GetMessage() передаст управление назад в Windows.
Параметр hwnd функции GetMessage() определяет, для какого окна необходимо получить сообщение. Если в приложении несколько окон, то желательно, чтобы сообщения принимались каждым из них отдельно. Если же необходимо передавать сообщения непосредственно приложению, то в качестве данного параметра нужно задать NULL.
Оставшиеся два параметра функции GetMessage() определяют диапазон идентификаторов принимаемых сообщений. Как правило, приложение принимает все сообщения. В этом случае параметры min и max должны задаваться равными нулю, что и сделано в данной программе.
Функция GetMessage() возвращает ноль, когда пользователь завершает работу с программой, что эквивалентно завершению цикла сообщений. В противном случае возвращается ненулевое значение.
В цикле сообщений вызываются две функции. Первая из них — это API-функция TranslateMessage(). Она преобразует виртуальные коды клавиш, генерируемые Windows 95, в сообщения клавиатуры. Хотя эта функция не обязательно должна использоваться во всех приложениях, тем не менее, большинство программ ее вызывают для корректной работы с клавиатурой.
Когда сообщение прочитано и преобразовано, оно должно быть передано назад в Windows с помощью API-функции DispatchMessage(). Windows будет хранить это сообщение до тех пор, пока не сможет передать его программе в качестве параметра функции окна.
Когда цикл сообщений завершается, функция WinMain() также завершает свое выполнение, возвращая Windows 95 значение поля msg.wParam. Это поле содержи код возврата, генерируемый при завершении программы.