Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
каркас.doc
Скачиваний:
59
Добавлен:
03.06.2015
Размер:
1.6 Mб
Скачать

Наиболее распространенные стили

Макрос

Свойство

1

WS_OVERLAPPED

Стандартное окно с рамкой

2

WS_MAXIMIZEBOX

Наличие кнопки развертки

3

WS_MINIMIZEBOX

Наличие кнопки минимизации

4

WS_SYSMENU

Наличие системного меню

5

WS_HSCROLL

Наличие горизонтальной панели прокрутки

6

WS_VSCROLL

Наличие вертикальной панели прокрутки

Наконец, параметр hThisInst должен представлять дескриптор текущего экзем­пляра приложения.

Когда окно создано, оно еще не отображается на экране. Для того чтобы отобразить окно, следует вызвать функцию API ShowWindow():

BOOL ShowWindow(HWND hwnd, int nHow).

Параметр hwnd задает дескриптор окна, которое должно быть отображено, а параметр nHow – способ отображения. Когда окно в первый раз должно отобразиться на экране, в качестве nHow можно использовать значение параметра nWinMode функции WinMain(), поскольку это значение определяет, как окно должно отображаться в начале выполнения программы. Можно также использовать значения из таблицы 2.5.

Таблица 2.5

Параметры способа отображения nHow

Макрос

Эффект

1

SW_HIDE

Скрыть окно (окно не отображается)

2

SW_MAXIMIZE

Развернуть окно до полноэкранного представления

3

SW_MIINIMIZE

Свернуть окно до иконки

4

SW_RESTORE

Отобразить окно в нормальном представлении

Функция ShowWindow() возвращает ненулевое значение, если до ее вызова окно было отображено на экране.

Хотя это и не вызвано необходимостью, вызов функции UpdateWindow() включен в каркасную программу, поскольку этот вызов требуется практически для всех приложений Windows.

Вызов UpdateWindow() означает немедленную перерисовку окна, и Windows в этом случае направляет программе сообщение, указывающее на необходимость перерисовки (это сообщение рассматривается в следующей главе).

2.9. Цикл обработки сообщений

Последней частью программы WinMain() является цикл обработки сообщений. Такой цикл содержится во всех приложениях для Windows. Его целью является получение и обработка сообщений, передаваемых операционной системой. Эти сообщения ставятся в очередь сообщений приложения, откуда они затем (по мере готовности программы) выбираются функцией API GetMessage():

BOOL GetMessage(LPMSG msg, HWND hwnd,

UINT min, UINT max) .

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

// Структура сообщения

typedef struct tagMSG

{

HWND hwnd; // Окно для направленного сообщения

UINT message;// Собственно сообщение

WPARAM wParam; // Дополнительная информация

LPARAM lParam; // к сообщению

DWORD time; // Время посылки сообщения

POINT pt; // Положение курсора мыши

} MSG;

В поле hwnd структуры MSG записывается дескриптор окна, которому адресовано сообщение; тип сообщения записывается в 32-разрядное поле message, а дополнительная информация (параметры сообщения) – в поля wParam и lParam. Типы WPARAM и LPARAM определены при помощи typedef соответственно как UINT и LONG.

Время посылки сообщения записывается в поле time в миллисекундах. Поле pt содержит координаты курсора мыши в момент посылки сообщения. Структура POINT, в которую записываются эти координаты, определяется так:

typedef struct tagPOINT

{

LONG x,y;

} POINT;

Если очередь сообщений приложения пуста, вызов GetMessage() возвратит управ­ление Windows. (Более детально сообщения рассматриваются в следующей главе.)

Параметр hwnd функции GetMessage() определяет окно, которому направляется получаемое сообщение. Возможно, и даже скорее всего, Ваше приложение будет содержать несколько окон, а Вы захотите получать сообщения, адресованные только одному фиксированному окну. Если же Вы хотите получать все сообщения, адресо­ванные Вашему приложению, параметр hwnd должен быть равен NULL.

Остальные два параметра функции GetMessage() определяют диапазон получае­мых сообщений. Чаще всего Вам нужно будет получать все сообщения. Для этого параметры min и max должны быть равны 0, как это сделано в каркасной программе.

GetMessage() возвращает нуль, когда пользователь завершает программу. Иначе возвращается ненулевое значение.

Внутри цикла обработки сообщений вызываются две функции. Вначале вызывается функция API TranslateMessage(), которая транслирует виртуальные коды клавиш, генерируемые Windows, в клавиатурные сообщения. (Виртуальные коды клавиш рассматриваются в гл. 4.) Хотя это и не является необходимым, большинство приложений вызывают TranslateMessage(), поскольку это позволяет использовать в программе ввод с клавиатуры.

Когда сообщение прочитано и преобразовано, функция API DispatchMcssage() возвращает его обратно к Windows. Windows хранит это сообщение до тех пор, пока оно не будет послано оконной функции приложения.

Когда цикл обработки сообщений завершается, функция WinMain() также заканчивается, возвращая значение msg.wParam . Это значение будет кодом возврата программы.