type
TForm1 = class(TForm)
Image3: TImage;
Image2: TImage;
Image1: TImage;
procedure FormCreate(Sender: TObject);
protected
procedure ImagesWindowRgn;
public
end;
var
Form1: TForm1;
implementation
uses Types;
{$R *.dfm}
procedure TForm1.ImagesWindowRgn;
var
FullRgn, Rgn: THandle;
ClientX, ClientY, i , k: integer;
x, y, firstx, cl : integer;
last : boolean;
temprgn : hrgn;
Begin
k:=0;
ClientX := (Width - ClientWidth) div 2;
ClientY := Height - ClientHeight - ClientX;
FullRgn:=CreateRectRgn(0,0,Width,Height);
Rgn:=CreateRectRgn(ClientX,ClientY,ClientX+ClientWidth,ClientY+ClientHeight);
CombineRgn(FullRgn,FullRgn,Rgn,RGN_DIFF);
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);
//***************************************************************************************
if (TImage(Controls[i]).Picture) <> nil then
with TImage(Controls[i]) do
Begin
if Transparent then
cl := Picture.Bitmap.Canvas.Pixels [0, 0];
for y:=0 to Picture.Bitmap.height-1 do
begin
firstx:=0; last:=false;
for x:=0 to Picture.Bitmap.width-1 do
if(abs( Picture.Bitmap.canvas.pixels[x,y] - cl)>0) and (x<>pred( Picture.Bitmap.width)) then
begin
if not last then
begin
last:=true;
if Transparent then
firstx:=x;
end;
end else
if last then
begin
last:=false;
temprgn:=CreateRectRgn( firstx+left,
y+Top,
left+x,
Top+y+1);
// temprgn:=createrectrgn(firstx,y,x,y+1);
CombineRgn(FullRgn,FullRgn,temprgn,RGN_or);
deleteobject(temprgn);
end;
end;
end;
//***************************************************************************************
end;
SetWindowRgn(Handle,FullRgn,true);
end;
Код написан на языке Delphi и используется для скрытия формы, оставляя ее компоненты (изображения) видимыми.
В процедуре FormCreate стиль рамки устанавливается в bsNone, а горизонтальные и вертикальные полосы прокрутки делаются невидимыми.
В процедуре ImagesWindowRgn создается два региона: один для всей формы (FullRgn) и другой для клиентской области формы (Rgn). Затем эти два региона комбинируются с помощью функции CombineRgn с флагом RGN_DIFF, чтобы создать регион, исключающий клиентскую область. Это означает, что любая область вне клиентской области не будет видима.
Затем проходит через все контролы на форме и проверяет каждый контроль, является ли он изображением. Если это так, то создается еще один регион (temprgn) для каждого непрозрачного пикселя в изображении и комбинируется с FullRgn с помощью функции CombineRgn с флагом RGN_OR. Это означает, что любые непрозрачные пиксели будут видимы.
Наконец, устанавливается регион окна формы в FullRgn с помощью функции SetWindowRgn.
Результат - форма сама по себе невидима, но ее компоненты (изображения) все еще видимы и могут быть взаимодействованы как обычно.
Как сделать форму невидимой, а компоненты (image) видимые, используя Delphi и обработку региона окна (window region).
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.