Создание и отображение окна с использованием функций Windows API

Создание окна и показ его на экране в Windows происходит в три этапа.

1. Регистрация класса окна с помощью функции RegisterClass;

2. Создание окна с помощью функции CreateWindow;

3. Показ окна на экране с помощью функции ShowWindow.

 

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

HWNDCreateWindow(

LPCTSTR lpClassName, //указатель на зарегистрированное имя //класса окна

LPCTSTR lpWindowName, //указатель на имя окна

DWORD dwStyle, //стиль окна

int x, //расположение окна по горизонтали

int y, //расположение окна по вертикали

int nWidth, //ширина окна

int nHeight, //высота окна

HWND hWndParent, //идентификатор (handle - хендл) //родительского окна или окна-владельца

HMENU hMenu, //идентификатор оконного меню или //дочернего окна

HANDLE hInstance, //идентификатор экземпляра приложения

LPVOID lpParam //указатель на данные для создания окна

);

 

Однако для создания стандартных элементов управления можно воспользоваться упрощенной схемой. Например, для создания кнопки можно указать предопределенный класс окна “BUTTON”, который нужно передать как строку, оканчивающуюся нулевым символом, в Object Pascal это тип PChar.

Для следующего примера добавьте на форму приложения еще одну кнопку. Система Delphi даст ей имя Button2. Придайте обработчику нажатия на кнопку Button2 следующий вид.

procedure TForm1.Button2Click(Sender: TObject);

var

hw: HWND;

begin

hw:= CreateWindow(

PChar(‘BUTTON’),

PChar(‘MyWindow’),

WS_VISIBLE,

100,30,

70,50,

0,

0,

0,

nil);

//ShowWindow(hw,SW_SHOW);

end;

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

В результате работы данной процедуры вы должны увидеть на экране кнопку, у которой имеется строка заголовка как у обычного окна с надписью MyWindow. Эта же надпись будет помещена и на самой кнопке. Кнопка будет существовать как отдельное окно на рабочем столе Windows.

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

Каким же образом создать кнопку, чтобы она выглядела как обычно и принадлежала окну формы Form1? Для этого нужно при вызове функции CreateWindow изменить три параметра: dwStyle, hWndParent и hInstance. В параметре стиля окна указываем что оно является дочерним: WS_CHILD; указываем идентификатор окна-предка или окна-владельца: Form1.Handle; указываем уникальный идентификатор экземпляра приложения, который операционная система передает приложению сразу после запуска: hInstance. В Delphi для этого имеется специальная глобальная переменная, которая так и называется: var HInstance: LongWord. Эта переменная описана в модуле SysInit. Хотя в операционных системах Windows NT/2000/XP этот параметр при создании окна просто игнорируется.

Итак, вызов функции CreateWindow для создания кнопки на форме Form1:

hw:= CreateWindow(

PChar(‘BUTTON’),

PChar(‘MyWindow’),

WS_CHILD or WS_VISIBLE,

100,30,

85,50,

Form1.Handle,

0,

hInstance,

nil);

 

Рисование на окне Windows

Графическое изображение на окне создается с помощью объектов рисования линий и закрашивания. Эти объекты являются таковыми лишь по названию, как совокупность ресурсов операционной системы, а не в смысле объектно-ориентированного программирования. Линии имеют такие характеристики как толщина, вид, цвет. Закраска может иметь определенный цвет и тип, например, закраска горизонтальными, диагональными линиями, сплошная и т п. . При выводе на экран рисованной фигуры с помощью функции Windows API система определяет что в этой фигуре должно быть нарисовано с помощью линий, а что закрашено. Объект рисования линий называется Pen – перо, а объект для закраски Brush – кисть.

Для указания на определенный тип пера или кисти их нужно предварительно создать с помощью функции CreateObject. Затем, указать эти объекты в качестве текущих в контексте устройства окна в которое планируется осуществить вывод графики. Выбор текущего объекта осуществляется функцией SelectObject. Освобождение ресурсов операционной системы, связанных с объектами перо и кисть производится с помощью функции DeleteObject.

Параметрами функции SelectObject могут быть кроме пера и кисти также и некоторые другие объекты, которые перечислены ниже. Для создания объектов, которые используются при рисовании средствами Windows API, также могут применяться специализированные функции, использование которых может быть оправдано в некоторых типичных ситуациях.

Описание функции:

HGDIOBJ SelectObject(

HDC hdc, // идентификатор контекста устройства

HGDIOBJ hgdiobj //идентификатор выбираемого объекта

);

 

В нашем случае выбора пера или кисти на выходе функции получаем идентификатор соответствующего объекта бывшего текущим до вызова функции SelectObject. Этот идентификатор объекта типа HGDIOBJ следует использовать для установления в качестве текущего после применения функций рисования с использованием определенного пера или кисти.

Параметр hgdiobj типа HGDIOBJ определяет выбираемый объект. Этот объект должен быть предварительно создан одной из следующих функций:

Объект Функции

Pen CreatePen, CreatePenIndirect

Brush CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush

Font CreateFont, CreateFontIndirect

Bitmap CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection

Region CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect

 

Здесь Font – шрифт; Bitmap – битовая карта, точечное (растровое) изображение; Region – регион, область, определяющая определенную часть окна, которая должна быть видима на экране и соответственно невидимую область окна. С помощью регионов можно создать, например, кнопку овальной или другой произвольной формы. Для подробного ознакомления с данными объектами следует обратиться к документации.