我需要制作一个程序,其中有一个包含PNG图像与透明区域的窗体。窗体必须是不可见的,而图像必须保持可见,透明区域必须保持透明。问题是图像的透明度。在这种情况下,主窗体是透明的,不可见的,而所有的组件/控件保持可见。但是,PNG图像的透明区域不保持透明度。如何保持透明度?
procedure MakeTransparent;
var
AControl: TControl;
A, Margin, X, Y, CtlX, CtlY: Integer;
begin
Margin := (Width - ClientWidth) div 2;
FullRgn := CreateRectRgn(0, 0, Width, Height);
X := Margin;
Y := Height - ClientHeight - Margin;
ClientRgn := CreateRectRgn(X, Y, X + ClientWidth, Y + ClientHeight);
CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF);
for A := 0 to ControlCount - 1 do
begin
AControl := Controls[A];
if (AControl is TWinControl) or (AControl is TGraphicControl) then with AControl do
begin
if Visible then
begin
CtlX := X + Left;
CtlY := Y + Top;
CtlRgn := CreateRectRgn(CtlX, CtlY, CtlX + Width, CtlY + Height);
CombineRgn(FullRgn, FullRgn, CtlRgn, RGN_OR);
end;
end;
end;
SetWindowRgn(Handle, FullRgn, True);
end;
procedure UndoTransparency;
begin
FullRgn := CreateRectRgn(0, 0, Width, Height);
CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
SetWindowRgn(Handle, FullRgn, True);
end;
2条答案
按热度按时间2nbm6dog1#
只需将此代码与一个按钮放在表单中,您就会看到包含PNG的表单变得透明:
ddhy6vgd2#
如果需要部分透明,则"透明颜色“/”透明颜色值“将不起作用。
对于NonAero(或DisabledAero)和EnabledAero情况,您将需要使用两种完全不同的方法。
启用Aero后,您必须使用以下方法:http://delphihaven.wordpress.com/category/glass/
当Aero被禁用或不存在,那么你将不得不使用某种黑客:
1.设置AlphaBlend:=真;
1.用BitBlt+GetDC+GetDesktopWindow制作桌面截图。您的窗口不会出现在该截图上。
1.在你的表格上画一个与你的表格位置和大小相同的截图。事实上,你会画出你的表格后面的东西,这就是为什么它看起来像透明的。
1.定期重复操作2和3。