92978b58

Создание главного окна приложения


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

В общем случае окно создается функцией WinCreateWindow , которую мы рассмотрим немного позже. Для создания главного окна приложения удобнее всего воспользоваться другой функцией, которая называется WinCreateStdWindow .

Для того чтобы вам была понятнее описанная ниже процедура создания главного окна, вспомним, что на самом деле окно приложения, которое видит пользователь, состоит из нескольких окон. Остановимся на этом подробнее.

Главное окно приложения называется Frame Window и на его поверхности расположены все остальные окна, а именно: окно пиктограммы системного меню, заголовок окна, вертикальные и горизонтальные полосы просмотра (если они есть), кнопки минимизации и максимизации окна, окно меню приложения, а также клиентское окно Client Window , внутри которого приложение обычно что-нибудь рисует.

Когда ранее мы говорили про создание главного окна приложения, то несколько упрощали ситуацию. На самом деле необходимо создать окна Frame Window , Client Window , а также другие окна, которые служат в качестве органов управления - системное меню, полосы просмотра и т. д.

К счастью, вы можете создать все эти окна при помощи одного вызова функции WinCreateStdWindow . Задавая соответствующим образом параметры этой функции, вы можете изменять внешний вид окна приложения, создавая (или не создавая) в окне Frame Window те или иные элементы управления.

Особое значение имеет окно Client Window , которое мы будем также называть клиентским окном приложения. Именно в этом окне приложение выполняет рисование, используя его как рабочее (хотя при необходимости приложение может рисовать в любом месте окна Frame Window или даже в любом месте на поверхности рабочего стола графической оболочки Workplace Shell).

Окно Frame Window , как и окна, соответствующие стандартным органам управления (таким как меню или кнопки), создаются на базе классов окна, предопределенных в системе Presentation Manager.


Что же касается окна Client Window , то это окно создается всегда на базе класса, зарегистрированного приложением. Приложение должно определить функцию окна, которая будет обрабатывать сообщения, предназначенные окну Client Window.

Для упрощения клиентское окно Client Window иногда называют главным окном приложения, хотя вы должны понимать, что настоящим главным окном является окно Frame Window . Функция окна Frame Window находится внутри системы Presentation Manager и вам не надо о ней беспокоиться.

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

#define ID_APP_FRAMEWND 1 HWND hWndFrame; HWND hWndClient; ULONG flFrameFlags = FCF_SYSMENU | FCF_TITLEBAR | FCF_MINMAX | FCF_SIZEBORDER | FCF_SHELLPOSITION | FCF_TASKLIST | FCF_ICON;

CHAR szAppTitle[] = "My First OS/2 Application"; CHAR szWndClass[] = "MYWINDOW";

hWndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE , &flFrameFlags, szWndClass, szAppTitle, 0, 0, ID_APP_FRAMEWND, &hWndClient);

if(hWndFrame == NULLHANDLE) { WinDestroyMsgQueue (hmq); WinTerminate (hab); return(-1); }

Ниже мы привели прототип функции WinCreateStdWindow с кратким описанием параметров:

HWND WinCreateStdWindow ( HWND hwndParent, // идентификатор родительского окна ULONG flStyle, // стиль окна Frame Window PULONG pflCreateFlags, // флаги создания // окна Frame Window PSZ pszClassClient, // имя класса клиентского окна PSZ pszTitle, // заголовок окна ULONG flStyleClient, // стиль клиентского окна HMODULE Resource, // идентификатор ресурсов ULONG ulId, // идентфикатор окна Frame Window PHWND phwndClient); // идентификатор клиентского окна



В качестве первого параметра hwndParent вы должны передать этой функции идентификатор родительского окна. В следующей главе мы рассмотрим подробнее "семейные" отношения в мире окон Presentation Manager. Сейчас ограничимся таким определением: родительское окно - это то окно, которое создало данное окно и потому связано с ним некоторыми "отношениями".


Например, дочернее окно всегда отображается внутри родительского, не выходя за его границы.

В нашем случае в качестве родительского выступает окно рабочего стола, которое имеет идентификатор HWND_DESKTOP , определенный в файле os2.h.

Параметр flStyle определяет стиль окна Frame Window . В качестве стиля вы можете использовать комбинацию перечисленных ниже констант, объединенных при помощи логической операции ИЛИ.

Стиль Описание
WS_SYNCPAINT Синхронное обновление окна. Этот стиль установлен для тех окон, которые созданы на базе класса окна со стилем CS_SYNCPAINT
WS_ANIMATE Включение режима анимации при открывании и закрывании окна. Если этот режим включен, то при изменении размеров окна пользователю будет казаться, что эти размеры плавно изменяются. Заметим, что если анимация окна отключена в блокноте свойств System-Settings, то этот стиль будет проигнорирован
WS_CLIPCHILDREN Если указан этот стиль, то область, занимаемая дочерними окнами, не перерисовывается
WS_CLIPSIBLINGS Если указан этот стиль, то область, занимаемая окнами, имеющими общих родителей, не перерисовывается
WS_DISABLED Окно заблокировано
WS_MAXIMIZED Окно создается максимизированным
WS_MINIMIZED Окно создается минимизированным
WS_PARENTCLIP Если указан этот стиль, окно не рисует вне занимаемой им прямоугольной области
WS_SAVEBITS В момент отображения окна выполняется сохранение графического изображения области под окном, имеющим этот стиль
WS_VISIBLE После создания окно становится видимым. Если этот стиль не указан, то окно создается невидимым, даже если оно не закрыто другими окнами
В нашем примере мы указали стиль WS_VISIBLE , поэтому сразу после создания окна вы увидите его на экране.

Следующий параметр называется pflCreateFlags. Он представляет собой указатель на переменную типа ULONG, в которую перед вызовом функции WinCreateStdWindow необходимо записать флаги создания окна Frame Window .

Ниже мы привели список возможных значений флагов. Эти значения можно объединять при помощи логической операции ИЛИ.



Флаг Описание
FCF_TITLEBAR Если указан этот флаг, в окне Farme Window будет создано окно заголовка
FCF_SYSMENU Будет создано системное меню
FCF_MENU -//- стандартное меню
FCF_MINMAX -//- кнопки минимизации и максимизации
FCF_MINBUTTON -//- кнопка минимизации
FCF_MAXBUTTON -//- кнопка максимизации
FCF_VERTSCROLL -//- вертикальная полоса просмотра
FCF_HORZSCROLL -//- горизонтальная полоса просмотра
FCF_SIZEBORDER -//- рамка для изменения размеров окна
FCF_BORDER Вокруг окна будет нарисована тонкая рамка
FCF_DLGBORDER Вокруг окна будет нарисована рамка, которая используется в стандартных диалоговых панелях
FCF_ACCELTABLE Из ресурса приложения, идентификатор которого указан в параметре Resource функции WinCreateStdWindow , будет загружена таблица акселераторов (будет рассмотрена позже)
FCF_ICON С создаваемым окном связывается пиктограмма, которая идентифицируется параметром Resource функции WinCreateStdWindow . Эта пиктограмма автоматически загружается при создании окна и также автоматически удаляется при уничтожении окна
FCF_SHELLPOSITION Размеры и расположение создаваемого окна определяет оболочка Workplace Shell (а не приложение)
FCF_SYSMODAL Создается системное модальное окно (об этом мы расскажем позже)
FCF_NOBYTEALIGN Если установлен этот флаг, при создании окна не выполняется оптимизация выравнивания соответствующих структур данных в оперативной памяти, которая в некоторых случаях могла бы привести к ускорению процесса отображения окна
FCF_TASKLIST Если установлен этот флаг, к заголовку окна добавляется название программы. Полученная таким образом строка используется при отображении списка задач, запущенных в операционной системе IBM OS/2
FCF_NOMOVEWITHOWNER При перемещении окна, которое является владельцем окна с установленным флагом FCF_NOMOVEWITHOWNER, последнее не должно перемещаться
FCF_AUTOICON Если окно минимизировано, ему не посылается сообщение WM_PAINT , предназначенное для инициирования процедуры перерисовки содержимого окна. Этот флаг оказывает благоприятное влияние на производительность системы
FCF_STANDARD Эквивалент следующей комбинации флагов:

FCF_TITLEBAR | FCF_SYSMENU |

FCF_MINBUTTON | FCF_TASKLIST |

FCF_MAXBUTTON |

FCF_SIZEBORDER | FCF_ICON |

FCF_ACCELTABLE | FCF_MENU |

FCF_SHELLPOSITION

Если указан флаг FCF_STANDARD, следует определить все необходимые ресурсы: пиктограмму приложения, меню, таблицу акселераторов
<


Обратите внимание, что в качестве параметра pflCreateFlags вы должны передать функции WinCreateStdWindow указатель на слово, содержащее флаги, а не само слово флагов.

Продолжим изучение параметров функции WinCreateStdWindow .

Через параметр pszClassClient вы должны передать функции имя зарегистрированного ранее класса окна Client Window . Напомним, что эта регистрация выполняется с помощью функции WinRegisterClass .

Параметр pszTitle передает функции WinCreateStdWindow указатель на текстовую строку, содержащую заголовок окна. Параметр pszTitle игнорируется, если не указан флаг FCF_TITLEBAR .

Параметр flStyleClient определяет стиль клиентского окна Client Window . Он игнорируется, если параметр pszClassClient содержит указатель на пустую текстовую строку.

Теперь о параметре Resource. Этот параметр указывает идентификатор модуля, содержащий ресурсы приложения. На данном этапе мы будем указывать для этого параметра нулевое значение. При этом загрузка ресурсов будет выполняться из EXE-файла приложения.

Что такое ресурсы приложения ?

Это данные, которые могут быть физически расположены в загрузочном EXE-файле приложения или в DLL-файле библиотеки динамической загрузки. Вы можете таким образом создать и сохранить в загрузочном файле приложения пиктограммы, меню, диалоговые панели, текстовые строки и другие типы данных, в том числе произвольные данные. При запуске приложения те ресурсы, которые не нужны, могут оставаться на диске. Они не будут отнимать у приложений дефицитную оперативную память. В то же время как только они потребуются, операционная система загрузит их в память автоматически.

Более подробное описание приемов работы с ресурсами мы приведем позже. В нашем первом приложении определен только один ресурс - пиктограмма.

Следующий параметр, который вы должны указать для функции WinCreateStdWindow , это параметр ulId. Он задает идентификатор окна Frame Window . Все ресурсы, относящиеся к одному окну Frame Window, должны иметь одинаковый идентификатор.Вы можете использовать любое значение в диапазоне от 0 до 0xFFFF.

Обращаем ваше внимание, что идентификатор окна, полученный от функции WinCreateStdWindow (или WinCreateWindow), и идентификатор, передаваемой этим функциям в качестве параметра ulId - разные по смыслу вещи. Первый из них используется для посылки сообщений окну или выполнения других операций, таких, например, как блокирование. Идентификатор ulId играет важную роль при обработке сообщений, поступающих от данного окна в родительское окно и позволяет определить, от какого окна пришло сообщение. Подробнее об использовании этого идентификатора вы узнаете из главы, посвященной органам управления.

И, наконец, последний параметр phwndClient должен содержать указатель на переменную типа HWND, в которую будет записан идентификатор созданного клиентского окна Client Window . Обращаем внимание, что здесь нужно использовать именно указатель, а не имя переменной.


Содержание раздела