我有一个由 a 组成的对象TFrame
,在它上面 aTPanel
和在那个 a 上TImage
。一个位图被分配给TImage
包含一个钢琴卷。这个框架对象放在一个TImage
,包含一个包含网格的图像。有关示例,请参见图像。
问题:是否可以使框架部分透明,从而使包含网格(在主窗体上)的背景图像隐约可见?理想情况下,透明度的数量可以由用户设置。位图是 32 位深,但尝试 alpha 通道并没有帮助。面板不是绝对必要的。它用于在对象周围快速设置边框。我可以把它画在图像上。
更新 1添加了一个小代码示例。主机用垂直线绘制背景。第二个单元包含一个 TFrame 和一个在其上绘制水平线的 TImage。我想看到的是垂直线部分通过 TFrame 图像发光。
更新 2我在原始问题中没有指定的内容:TFrame 是更大应用程序的一部分并且独立运行。如果透明度问题可以由 TFrame 本身处理,那将有所帮助。
///////////////// Main unit, on mouse click draw lines and plot TFrame
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,
Unit2;
type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var background: TBitmap;
f: TFrame2;
i, c: Int32;
begin
background := TBitmap.Create;
background.Height := Image1.Height;
background.Width := Image1.Width;
background.Canvas.Pen.Color := clBlack;
for i := 0 to 10 do
begin
c := i * background.Width div 10;
background.Canvas.MoveTo (c, 0);
background.Canvas.LineTo (c, background.Height);
end;
Image1.Picture.Assign (background);
Application.ProcessMessages;
f := TFrame2.Create (Self);
f.Parent := Self;
f.Top := 10;
f.Left := 10;
f.plot;
end;
end.
///////////////////Unit containing the TFrame
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TFrame2 = class(TFrame)
Image1: TImage;
procedure plot;
end;
implementation
{$R *.dfm}
procedure TFrame2.plot;
var bitmap: TBitmap;
begin
bitmap := TBitmap.Create;
bitmap.Height := Image1.Height;
bitmap.Width := Image1.Width;
bitmap.PixelFormat := pf32Bit;
bitmap.Canvas.MoveTo (0, bitmap.Height div 2);
bitmap.Canvas.LineTo (bitmap.Width, bitmap.Height div 2);
Image1.Picture.Assign (bitmap);
end;
end.
更新 3我曾希望会有一些消息或 API 调用会产生一个解决方案,即控件可以使其自身部分透明,就像 WMEraseBkGnd 消息为完全透明所做的那样。在他们的解决方案中,Sertac 和 NGLN 都指向使用 AlphaBlend 函数模拟透明度。此功能合并两个位图,因此需要了解背景图像。现在我的 TFrame 有一个额外的属性:BackGround: TImage
由父控件分配。这给出了预期的结果(看到它工作真是太专业了:-)
RRUZ 指向 Graphics32 库。我所看到的它产生了惊人的结果,对我来说学习曲线太陡峭了。
感谢大家的帮助!