Визуальное программирование / Лабораторная работа-9_ИС
.docЛабораторная работа № 9
Работа с WIN API функциями. Изменение внешнего вида стандартной экранной формы. Регионы
Теоретический материал
Регион создается одной из функций API:
function CreateRectRgn(X1, Y1, X2, Y2: Integer): HRGN;
function CreateRectRgnIndirect(const p1: TRect): HRGN;
Функция CreateRectRgn создает регион прямоугольной формы (параметры задают координаты для верхнего левого и нижнего правого угла прямоугольника, задающего регион. Функция CreateRectRgnIndirect аналогична функции CreateRectRgn – разница в том, что вместо четырех координат функция получает структуру типа TRect .
function CreateRoundRectRgn(X1, Y1, X2, Y2, H, W: Integer): HRGN;
Функция CreateRoundRectRgn аналогична функции CreateRectRgn, но создаваемая прямоугольная область имеет скругленные углы. X1, Y1 – координаты верхнего левого угла, X2, Y2 – координаты нижнего правого, H, W – высота и ширина эллипса, применяемого для скругления углов
function CreatePolygonRgn(const Points; Count, FillMode: Integer): HRGN;
Функция CreatePolygonRgn создает регион, ограниченный многоугольником, вершины которого заданы в массиве Points (элемент массива – пара координат x, y). Параметр Count указывает количество точек в массиве, FillMode определяет, какие точки будут принадлежать региону (возможно два режима – ALTERNATE и WINDING) .
function CreatePolyPolygonRgn (const pPtStructs; const pIntArray; p3, p4: Integer): HRGN;
Функция CreatePolyPolygonRgn создает регион, состоящий из нескольких регионов. Параметр pPtStructs является массивом массивов точек (что-то типа двумерного массива), pIntArray является массивом, содержащем количество точек (вершин) для каждого из регионов, p3 – количество регионов, p4 – режим заполнения.
function CreateEllipticRgn(X1, Y1, X2, Y2: Integer): HRGN;
function CreateEllipticRgnIndirect(const p1: TRect): HRGN;
Данные функции создают эллиптический регион (эллипс вписан в прямоугольник, заданный в первом случае координатами верхнего левого и нижнего правого углов, во втором - структурой p1: TRect с такими же координатами).
Дополнительные функции для работы с регионами.
function CombineRgn(DestRgn, Rgn1, Rgn2: Cardinal; CombineMode: Ineger): Integer; |
Объединяет две области в одну. DestRgn – дескриптор результирующей области; Rgn1, Rgn2 – дескрипторы объединяемых областей; CombineMode – параметр, указывающий способ объединения. Параметр CombineMode может иметь следующие значения: RGN_AND- включает в результат общие части областей; RGN_COPY- копирует область Rgn1 в DestRgn; RGN_DIFF- исключает из Rgn1 часть, принадлежащую Rgn2; RGN_OR- объединяет области; RGN_XOR- включает в результат только те части областей, которые не принадлежат им одновременно. До применения функции область DestRgn уже должна существовать и иметь размеры, достаточные для размещения объединенной области. |
function EqualRgn(Rgn1,Rgn2: Cardinal): Bool; |
Проверяет эквивалентность двух областей. Rgn1, Rgn2 - дескрипторы сравниваемых областей. |
function FillRgn(DC, Rgn,Brush: Cardinal): Bool; |
Закрашивает область кистью. DC – дескриптор канвы окна; Rgn – дескриптор области; Brush – дескриптор кисти. |
function FrameRgn(DC, Rgn,Brush: Cardinal; Width,Height: Integer): Bool; |
Обводит область кистью высотой Height и шириной Width пикселей. DC – дескриптор канвы окна; Rgn – дескриптор области; Brush – дескриптор кисти. |
Function InvertRgn(DC, Rgn:Cardinal): Bool; |
Инвертирует цвет всех точек внутри области. DC – дескриптор канвы окна; Rgn – дескриптор области. |
function OffsetRgn(DC, Rgn:Cardinal; dX, dY: Integer):Integer; |
Смещает область на dX по горизонтали и на dY по вертикали. DC - дескриптор канвы окна; Rgn - дескриптор области. |
function PaintRgn(DC, Rgn:Cardinal): Bool; |
Rgn - дескриптор области. |
function PtInRegion(Rgn:Cardinal; X, Y: Integer):Bool; |
Проверяет принадлежность точки (X,Y) области с дескриптором Rgn. |
function RectInRegion(Rgn:Cardinal; Rect: TRect):Bool; |
Проверяет принадлежность прямоугольника Rect области с дескриптором Rgn. |
Назначение региона окну производится при помощи процедуры:
Procedure SetWindowRgn(
HWND hWnd, // дескриптор окна
HRGN hRgn, // дескриптор региона
BOOL bRedraw // флаг, управляющий перерисовкой окна после назначения региона
);
Пример.
procedure TForm1.RebuildWindowRgn;
var
Rgn, Rgn1 : HRGN; // Регионы
begin
// Настройка размеров окна
Height := 400;
Width := 600;
// Создание эллиптического региона размером с окно
Rgn := CreateEllipticRgn(0, 0, width, height);
// Создание прямоугольного региона
Rgn1 := CreateRectRgn(50, 50, 100, 100);
// Комбинирование регионов по RGN_XOR (сумма за вычетом пересечения)
CombineRgn (Rgn, Rgn, Rgn1, RGN_XOR);
// Создание региона
Rgn1 := CreateRectRgn(250, 250, 100, 100);
// Комбинирование регионов по RGN_DIFF (Rgn - Rgn1)
CombineRgn(Rgn, Rgn, Rgn1, RGN_DIFF);
// Назначение региона текущему окну
SetWindowRgn(Handle, Rgn, true);
end;
В результате окно становится эллиптическим, внутри окна есть прозрачная прямоугольная и "дырка", в левом углу к нему добавлена прямоугольная область (хорошо видна работа CombineRgn в режиме RGN_XOR).
Задания для самостоятельной работы.
-
Проанализировать работу с WIN API функциями в Delphi.
-
Проанализировать пример на использование регионов.
-
Изменить внешний вид экранных форм в двух ранее созданных приложениях.
Контрольные вопросы
-
Объектно-ориентированная методология разработки программ.
-
Win API функции и их применение.
-
Win API функции в Delphi.
-
Работа с регионами в Delphi.
-
Назначение функций CreateRectRgn, CreateRoundRectRgn, CreatePolygonRgn, CreateEllipticRgn.
-
Процедура SetWindowRgn.
-
Функция CombineRgn.