我有一个对象,由一个
更新1:添加了一个小的代码示例。主单元格绘制具有垂直线条的背景。第二个单元格包含一个TFrame和一个TImage,在其上绘制一条水平线。我想看到的是,垂直线条部分地透过TFrame图像闪耀出来。
更新2:我在原始问题中没有指定的是:TFrame是一个更大应用程序的一部分,并且行为独立。如果TFrame本身可以处理透明度问题,那将有所帮助。
TFrame
组成,在它上面有一个 TPanel
,在其上有一个 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 库。我看到它产生了极好的结果,但对我来说学习曲线太陡峭。
感谢大家的帮助!