Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
04-09-2015_19-17-13 / Конспект лекций.doc
Скачиваний:
98
Добавлен:
01.03.2016
Размер:
1.31 Mб
Скачать

17.6 Создание и показ окна

После того, как класс окна описан и зарегистрирован в системе, приложение на его основе может создать множество различных окон. Создание окна выполняется функцией Win32 API CreateWindow(). Для этого ей нужно передать множество параметров. В качестве результата функция возвращает уникальный дескриптор окна hwnd, который необходимо сохранить.

Возникает вопрос, почему для создания окна необходимы два шага: сначала определение класса окна, а лишь затем непосредственно его создание. Если не рассматривать этот вопрос в концепции объектно-ориентированного программирования, то это очень удобно для практической работы. В качестве наглядного примера приведем кнопки редактора MS Word. На самом деле это маленькие окна, созданные на базе одного класса. Они используют одну оконную функцию, которая обрабатывает сообщения, посланные этим окнам. Какой именно кнопке было послано сообщение, оконная функция определяет по полю hwnd в структуре сообщения. Наличие одного класса для всех кнопок гарантирует их одинаковое поведение. В то же время, каждая из этих кнопок отличается внешним видом. Но это уже дополнительные свойства окна-кнопки, которые задаются при создании экземпляра окна параметрами функции CreateWindow().

Процедура создания и показа окна вынесена у нас в подпрограмму Create(), в которой последовательно вызываются две функции Windows: CreateWindow() для создания главного окна и ShowWindow() для его вывода на экран.

Функция CreateWindow() имеет большое количество параметров, помощью которых определяются характеристики создаваемого окна. Перечень этих параметров с указанием их типов и краткими пояснениями приведен ниже.

Первый параметр LPCSTR szClassName – имя регистрируемого класса окна. Передача функции CreateWindow() имени класса позволяет использовать при создании окна те общие характеристики окна, которые были определены в структуре WNDCLASS, например, форму курсора и цвет фона. Вызывая функцию CreateWindow() многократно, можно создать много окон данного класса, различающихся, например, размерами и местоположением на экране. Однако пока мы создаем главное окно приложения, которое, очевидно должно быть в одном экземпляре.

Второй параметр LPCSTR szTitle – заголовок, который появится в верхней части окна. Значения параметров szTitle и szClassName являются указателями на ASCIIZ-строки.

Третий параметр DWORD определяет стиль окна. С помощью стиля задаются такие характеристики окна, как вид окружающей его рамки, наличие или отсутствие строки заголовка и целый ряд других. Стиль представляет собой двухсловное число, отдельные элементы которого закреплены за теми или иными элементами оформления или свойствами окна; каждому биту соответствует своя символическая константа. Так, установка бита 18 (0х00040000, константа WS_THICKFRAME) придает окну толстую рамку; установка бита 19 (0х00080000, WS_SYSMENY) снабжает окно системным меню; бит 21 (0х00200000, WS_VSCROLL) отвечает за появление линейки вертикальной прокрутки и т. д. Операция побитового ИЛИ (знак | ) позволяет “набрать” требуемый комплект свойств. При этом главное окно приобретает некоторые характеристики даже без указания соответствующих констант; для внутренних, порожденных окон требуемые свойства указываются в явной форме.

Параметр dwStyle определяет стиль окна приложения. Обычно главное окно описывается константой WS_OVERLAPPEDWINDOW (0х00CF0000), в которую входят элементы стиля WS_OVERLAPPED (перекрывающееся окно), WS_CAPTION (строка заголовка), WS_SYSMENU (системное меню), WS_THICKFRAME (толстая рамка), WS_MINIMIZEBOX (кнопка свертывания окна в пиктограмму) и WS_MAXIMIZEBOX (кнопка развертывания окна на весь экран). Если требуется создать главное окно с меньшим количеством элементов, весь необходимый набор придется указывать явным образом. Так, для создания главного окна без кнопок минимизации и максимизации константу стиля надо задать следующим образом:

WS_THICKFRAME | WS_SYSMENU

(строка заголовка появляется в главном окне в любом случае, а константа WS_OVERLAPPED равна 0 и ее указание не влияет на стиль). Значение параметра dwStyle задается константой или комбинацией констант. Символические имена этих констант описаны во включаемом файле winuser.h.

Следующие четыре параметра (int, int, int, int) определяют x- и y-координаты левого верхнего угла окна (относительно начала экрана) и размеры окна по горизонтали и вертикали (в пикселях). Константа CW_USEDEFAULT (80000000h), определенная в файле winuser.h, позволяет использовать значения этих параметров по умолчанию. Задание размеров окна в абсолютных единицах не всегда удобно. Если требуется, чтобы при изменении пространственного разрешения видеосистемы окно приложения всегда оставалось одного размера (но содержало бы при этом разное число пикселов), размер окна задается в долях полного размера экрана, который можно получить с помощью функции Windows GetSystemMetrics().

В качестве восьмого параметра HWND указывается дескриптор родительского окна. Между двумя окнами Windows-приложения можно устанавливать родовидовые отношения, дочернее окно всегда должно появляться в области родительского. Для главного окна, у которого нет родителя, используется константа HWND_DESKTOP.

Девятый параметр HMENU позволяет задать меню окна. Если меню нет (как в нашем случае) или используется меню класса, заданное в структуре WNDCLASS, этот параметр должен быть равен нулю (NULL).

Десятый параметр HINSTANCE hInst идентифицирует экземпляр приложения. Значение дескриптора приложения было получено нами через аргумент hInstance функции WinMain() и передано в функцию Create() через аргумент hInst.

Последний, одиннадцатый параметр void FAR* является адресом дополнительных данных, которые обычно не требуются; соответственно, мы указали адрес NULL.

Символическое обозначение NULL (нуль-указатель) используется в тех случаях, когда для некоторой функции надо указать нулевое значение аргумента, являющегося указателем. Значение NULL определяется как 0 (или 0L для моделей памяти с дальними указателями), так что формально во всех случаях вместо NULL можно использовать просто 0, однако обозначение NULL напоминает, что данный аргумент представляет собой адрес.

После вызова функции CreateWindow() в качестве результата возвращается дескриптор окна, он имеет уникальное значение и является одним из важнейших описателей объектов приложения. Он передается как параметр многим функциям Win32 API и как значение полей в некоторых структурах. Одновременно в приложении может быть создано и одновременно существовать несколько окон, поэтому с помощью значения дескриптора hwnd Windows однозначно идентифицирует то окно, для работы с которым вызывается та или иная функция Win32 API. Другой важный результат работы функции CreateWindow() – посылка асинхронного сообщения WM_CREATE в оконную функцию приложения.

Функция CreateWindow() возвращает (при успешном выполнении) дескриптор созданного окна. Во многих случаях, особенно для порожденных окон, этот дескриптор используется при последующих обращениях к данному окну, и его полезно сохранить в глобальной переменной. В данном случае дескриптор окна нужен только для передачи его в функцию ShowWindow(), поэтому он сохраняется в локальной переменной hwnd, существующей лишь пока выполняется подпрограмма Create().

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

После выполнения функции ShowWindow() на экране появляется главное окно с заданными нами характеристиками. Теперь для правильного функционирования приложения необходимо организовать цикл обработки сообщений.

Соседние файлы в папке 04-09-2015_19-17-13