Функции для создания пользовательского интерфейса

Создание пользовательского интерфейса достаточно трудоемкий процесс, причем реализовать его удобнее с использованием средств визуального программирования. Поэтому в данном разделе описываются лишь некоторые моменты, которые могут быть полезны при изучении взаимодействия программ.

Основой пользовательского интерфейса в Windows является, как это не удивительно, окно [5]. Каждое окно относится к тому или иному классу окна. Класс окна - это набор атрибутов, который использует система как шаблон для создания окна. С каждым классом окна ассоциируется специфичная оконная процедура, которая управляет поведением всех окон данного класса, обрабатывая посылаемые сообщения.

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

Регистрация класса окна осуществляется с помощью функции RegisterClass. Функция RegisterClass существует как в Unicode (RegisterClassW), так и в ANSI (RegisterClassA) версиях. Если регистрация класса происходит с помощью функции RegisterClassW, то приложение информирует ОС о том, что все текстовые параметры сообщений представлены в кодировке Unicode.

Для функции RegisterClass достаточно одного параметра - указателя на структуру данных, содержащую параметры окна. Эта структура данных имеет название WNDCLASS, должны быть заполнена (т.е. должны быть определены значения всех параметров этой структуры данных) перед тем, как будет вызвана функция регистрации класса окна.

Описание полей структуры данных WNDCLASS и типы данных представлены в таблице 7.

Таблица 7 - Описание структуры данных WNDCLASS

WNDCLASS Struc Название поля Тип в С Тип в ассемблере Назначение поля
  style; UINT DD Определяет стиль окна
lpfnWndProc; WNDPROC DD Указатель на процедуру окна
cbClsExtra; int DD информация о дополнительных байтах для данной структуры
cbWndExtra; int DD информация о дополнительных байтах для окна
hInstance; HINSTANCE DD дескриптор приложения
hIcon; HICON DD дескриптор загруженной иконки окна
hCursor; HCURSOR DD дескриптор загруженного курсора окна
hbrBackground; HBRUSH DD дескриптор загруженной кисти фона окна
lpszMenuName; LPCTSTR DD имя-идентификатор меню
lpszClassName; LPCTSTR DD определяет имя класса окон

Значения констант (стиль окна, идентификаторы иконок, курсоров и т.п.) можно найти в заголовочном файле WinUser.h, поставляемом со средой разработки Visual Studio. Необходимо обратить внимание, что при заполнении структуры данных типа WNDCLASS используется дескриптор приложения (возвращается после выполнения функции GetModuleHandle), дескриптор загруженной иконки окна (возвращается после выполнения функции LoadIcon), дескриптор загруженного курсора окна (возвращается после выполнения функции LoadCursor) и дескриптор кисти фона окна. В последнем случае можно использовать дескриптор кисти, используемой для окрашивания фона, а можно использовать значение стандартного системного цвета.

После определения параметров окна вызывается функция RegisterClass (см. приложение А).

Существует также и расширенная функция регистрации класса окна RegisterClassEx, которая использует расширенную структуру данных под названием, WNDCLASSEX. Структура данных WNDCLASSEX отличается от рассмотренной выше структуры данных WNDCLASS наличием двух дополнительных полей: cbSize (тип этого поля в языке С "UINT", а в языке ассемблера - DD), определяющий размер структуры данных WNDCLASSEX в байтах; hIconSm (тип этого поля в языке C "HICON", а в языке ассемблера - DD), определяющий дескриптор на маленькую иконку, ассоциированную с классом окна.

В остальном, функции RegisterClass и RegisterClassEx аналогичны.

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

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

Таблица 8 - Описание параметров функции CreateWindow

Название параметра Тип в С Тип в ассемблере Описание параметры
lpClassName, LPCTSTR DD Указатель на строку с именем класса окна
lpWindowName, LPCTSTR DD Указатель на строку с именем окна
dwStyle, DWORD DD Константа, определяющая стиль окна
x, int DD Горизонтальная координата левого верхнего угла окна
y, int DD Вертикальная координата левого верхнего угла окна
nWidth, int DD Ширина окна в пикселях
nHeight, int DD Высота окна в пикселях
hWndParent, HWND DD Дескриптор порождающего окна
hMenu, HMENU DD Дескриптор меню, используемого окном
hInstance, HINSTANCE DD Дескриптор приложения, создающего окно
lpParam LPVOID DD Указатель на значение, посылаемое окну через структуру CREATESTRUCT, на которую указывает параметр lParam сообщения WM_Create. Этот указатель может быть равен 0.

Функция CreateWindow существует как в Unicode (CreateWindowW), так и в ANSI (CreateWindowA) версиях. Кроме того, вместо стандартной функции CreateWindow можно использовать расширенную версию функции создания окна - CreateWindowEx, также доступную как в Unicode (CreateWindowExW), так и в ANSI (CreateWindowExA) версиях.

В отличии от функции CreateWindow, функция CreateWindowEx позволяет использовать дополнительные стили окна (добавляется поле dwExStyle типа DWORD (DD)).

В результате выполнения функции создания окна типа CreateWindow возвращается дескриптор созданного окна, в противном случае - возвращается нулевое значение.

Перед выходом из функции CreateWindow посылается сообщение WM_Create процедуре окна. Параметр lParam сообщения WM_Create содержит указатель на структуру CREATESTRUCT, определяющую начальные параметры, передаваемые оконной процедуре приложения. Параметры структуры CREATESTRUCT совпадают с параметрами функции CreateWindowEx.

Если в структуре CREATESTRUCT определен стиль окна WS_Visible, то функция CreateWindow посылает все необходимые сообщения для активации и показа окна.

Пример использования функции CreateWindow можно найти в приложении А.

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

Если окно уже в видимом состоянии на экране, возвращаемое функцией ShowWindow отлично от нуля. Если окно было спрятано - возвращаемое значение равно 0.

Пример использования функции ShowWindow можно найти в приложении А.

Таблица 9 - Описание параметров функции ShowWindow

Название параметра Тип в С Тип в ассемблере Описание параметра
hWnd HWND DD Дескриптор окна, которое необходимо показать
nCmdShow int DD Режим показа окна. Имена некоторых констант в С (значение констант для использования в ассемблере) приведены ниже: SW_HIDE (0) - прячет окно и активизирует другое окно SW_MAXIMIZE (3) - распахивает до максимального размера окно SW_MINIMIZE (6) - минимизирует окно и активизирует следующее окно верхнего уровня SW_RESTORE (9) - активизирует и показывает окно. Если окно было минимизировано или распахнуто, то ОС восстанавливает начальные размеры и положение SW_SHOW (5) - активизирует окно и показывает его в текущих размерах и положении

Для перерисовки клиентской части окна используется функция UpdateWindow. Эта функция посылает сообщение WM_Paint напрямую оконной процедуре. В качестве входных параметров этой функции выступает дескриптор окна, нуждающегося в обновлении. Если функция выполнилась успешно, то возвращаемое значение не равно 0, в противном случае - равно. Пример использования функции UpdateWindow можно найти в приложении А.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: