New Page 1
Delphi. Маленькие
хитрости: Прозрачная
форма (CreateRectRgn, CombineRgn, SetWindowRgn).
Ниже приведен текст примера
прозрачной формы:
unit
UnitClass;
interface
uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls;
type
TfrmGlass
=
class(TForm)
Button1:
TButton;
Button2:
TButton;
private
{ Private declarations }
protected
procedure
RebuildWindowRgn;
procedure
Resize;
override;
public
{ Public declarations }
constructor
Create(AOwner:
TComponent);
override;
end;
var
frmGlass:
TfrmGlass;
implementation
{$R *.dfm}
{ Прозрачная форма }
constructor
TfrmGlass.Create(AOwner:
TComponent);
begin
inherited;
// убираем сколлбары, чтобы не мешались
// при изменении размеров формы
HorzScrollBar.Visible:=
False;
VertScrollBar.Visible:=
False;
// строим новый регион
RebuildWindowRgn;
end;
procedure
TfrmGlass.Resize;
begin
inherited;
// строим новый регион
RebuildWindowRgn;
end;
procedure
TfrmGlass.RebuildWindowRgn;
var
FullRgn,
Rgn:
THandle;
ClientX,
ClientY,
I:
Integer;
begin
// определяем относительные координаты клиенской части
ClientX:=
(Width
-
ClientWidth)
div
2;
ClientY:=
Height
-
ClientHeight
-
ClientX;
// создаем регион для всей формы
FullRgn:=
CreateRectRgn(0,
0,
Width,
Height);
// создаем регион для клиентской части формы
// и вычитаем его из FullRgn
Rgn:=
CreateRectRgn(ClientX,
ClientY,
ClientX
+
ClientWidth,
ClientY
+
ClientHeight);
CombineRgn(FullRgn,
FullRgn,
Rgn,
rgn_Diff);
// теперь добавляем к FullRgn регионы каждого контрольного элемента
for
I:=
0
to
ControlCount
-1
do
with
Controls[I]
do
begin
Rgn:=
CreateRectRgn(ClientX
+
Left,
ClientY
+
Top,
ClientX
+
Left
+
Width,
ClientY
+
Top
+
Height);
CombineRgn(FullRgn,
FullRgn,
Rgn,
rgn_Or);
end;
// устанавливаем новый регион окна
SetWindowRgn(Handle,
FullRgn,
True);
end;
end. |
И вот как это будет выглядеть:
Теперь немного о принципе работы. При помощи функции
CreateRectRgn создаем новые области окна и объединяем их таким образом, что бы
все окно, кроме заголовка оказалось прозрачным. Данная функция является
функцией WinApi и имеет следующий синтаксис:
HRGN CreateRectRgn
(
int nLeftRect , // x-координата
верхнего левого угла области
int nTopRect , // y-координата
верхнего левого угла области
int nRightRect , // x-координата
правого нижнего угла области
int nBottomRect // y-координата
правого нижнего угла области
); |
Параметры:
nLeftRect - определяет x-координату верхнего
левого угла области.
nTopRect - определяет y -координату верхнего левого
угла области.
nRightRect - определяет x-координату правого нижнего
угла области.
nBottomRect - определяет y- координату правого
нижнего угла области.
Возвращаемые значения
В случае успеха возвращается дескриптор области.
В случае неудачи возвращается NULL.
Комментарии
В область не входят ее правая и нижняя границы.
Для объединения полученных регионов используем функцию
CombineRgn:
Функция CombineRgn объединяет две области и
сохраняет результат в третьей. Две области объединяются согласно указанному
режиму объединения.
int CombineRgn
(
HRGN hrgnDest , // дескриптор
результирующей области
HRGN hrgnSrc 1 , // дескриптор
исходной области
HRGN hrgnSrc 2 , // дескриптор
исходной области
int fnCombineMode // режим
объединения областей
); |
Параметры
hrgnDest - идентифицирует новую область с
размерами, определяемыми двумя исходными областями (область должна существовать
до вызова функции CombineRgn ).
hrgnSrc 1 - идентифицирует первую из двух исходных
областей.
hrgnSrc 2 - идентифицирует вторую из двух исходных
областей.
fnCombineMode - определяет режим объединения двух
областей. Может принимать одно из следующих значений:
Значение |
Пояснение |
RGN_AND |
Создается пересечение двух областей. |
RGN_COPY |
Создается копия области, идентифицируемой значением
параметра hrgnSrc 1 . |
RGN_DIFF |
Объединяются те части области, идентифицируемой
значением параметра hrgnSrc 1 , которые не являются частями области,
идентифицируемой значением параметра hrgnSrc 2 . |
RGN_OR |
Создается объединение двух областей. |
RGN_XOR |
Создается объединение двух областей, за исключением
любых пересекающихся участков. |
Возвращаемые значения
Возвращаемое значение показывает сложность результирующей
области и может принимать одно из следующих значений:
Значение |
Пояснение |
COMPLEXREGION |
Область состоит более чем из одного прямоугольника
|
ERROR |
Произошла ошибка |
NULLREGION |
Пустая область |
SIMPLEREGION |
Область является одиночным прямоугольником |
Комментарии
Области могут совпадать друг с другом. Например, значение
параметра hrgnSrc 1 может быть равно значению параметра hrgnDest .
После получения результатирующего региона мы применяем его к
нашему окну. Давайте так же посмотрим описание этой функции:
Вызов этой функции приводит к тому, что окно
приобретает заданную форму, согласно указанному региону.
int SetWindowRgn(
HRGN hRgn,
BOOL bRedraw
); |
Параметры
hRgn
Хендл региона, который необходимо установить.
bRedraw
Если этот флаг установлен в TRUE, то после установки региона окно будет
перерисовано.
Результат
Будет возвращено не нулевое значение, если
функция выполнена успешно, в случае сбоя выполнения, возвращается 0.
Примечание
Функция использует координаты относительно
левого верхнего угла окна, а не его клиентской области.
После успешного вызова SetWindowRgn,
система начинает оперировать с регионом, указанным в параметре hRgn.
Система не делает себе копии этого региона. Поэтому, после установки региона, не
выполняйте с ним никаких операции. Например, удалять его не надо, система сама
удалит регион, когда он перестанет быть нужным.
Скриншоты, помеченные знаком *,
являются цитатами и иллюстрациями в
программного продукта "Microsoft Windows",
авторское право на который принадлежит
Microsoft..
|