【问题标题】:Delphi 7 AlphaBlend not working for dynamic formDelphi 7 AlphaBlend 不适用于动态形式
【发布时间】:2021-02-14 12:07:06
【问题描述】:

我已经创建了动态表单作为下一个:

procedure TForm1.Button1Click(Sender: TObject);
var
 Frm:TForm2;
begin

frm:=TForm2.Create(nil);
Frm.Left:=5;
Frm.Top:=5;
Frm.Parent:=Self;
Frm.OnCreate:=OncreateFrm;
Frm.Show;
end;

当我试图改变 AlphaBlend 属性时,透明度不会改变..

procedure TForm1.OncreateFrm(Sender: TObject);
begin
AlphaBlend:=True;
AlphaBlendValue:=200;
end; 

还覆盖了构造函数,它给出了相同的结果..

谢谢。

【问题讨论】:

    标签: delphi dynamic transparency alphablending


    【解决方案1】:

    你的方法

    Frm := TForm2.Create(nil);
    Frm.Left := 5;
    Frm.Top := 5;
    Frm.Parent := Self;
    Frm.OnCreate := OncreateFrm;
    Frm.Show;
    

    不可能工作,因为您在第 5 行设置了 OnCreate 处理程序,这是在第 1 行创建表单之后;因此,在创建表单时(第 1 行),它看到 OnCreatenil,因此什么也不做。您在第 5 行的说明无效。

    这就像在你的朋友下班回家之后告诉你的恶魔“请在你下班回家的路上买点牛奶”

    解决方案

    1:在设计时设置属性

    当然,您可以在设计时使用Object Inspector 来设置TForm2AlphaBlendAlphaBlendValue 属性。但我怀疑你想动态地做,因为你问了这个问题。

    2:在TForm2 上使用OnCreate 处理程序

    只需在表单编辑器中打开TForm2 并双击它即可为其提供自己的OnCreate 处理程序:

    // in Unit2.pas
    procedure TForm2.FormCreate(Sender: TObject);
    begin
      AlphaBlend := True;
      AlphaBlendValue := 128;
    end;
    

    3:覆盖TForm2的构造函数

    // in Unit2.pas
    constructor TForm2.Create(AOwner: TComponent);
    begin
      inherited;
      AlphaBlend := True;
      AlphaBlendValue := 128;
    end;
    

    4:创建对象时设置属性

    // in Unit1.pas
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Frm: TForm2;
    begin
      Frm := TForm2.Create(nil);
      Frm.Left := 5;
      Frm.Top := 5;
      Frm.AlphaBlend := True;
      Frm.AlphaBlendValue := 128;
      Frm.Show;
    end;
    

    与前三种方法不同,这种方法只影响TForm2 的这个实例——它不影响类本身。

    所有这些方法都有效。

    有一个“但是”

    你的线路

    Frm.Parent := Self
    

    意味着你把这个表单变成了一个控件而不是一个顶级窗口。

    并且layered windows(VCL 的AlphaBlend 功能所基于的 Win32 功能)仅支持作为 Windows 8 及更高版本中的子窗口。

    因此,如果您使用的是 Windows 7 或更早版本,则在这种情况下不能使用AlphaBlend

    【讨论】:

    • 我认为“但是”是无法正常工作的原因,因为我已经尝试了上述所有解决方案。非常感谢。
    • @Issam:你使用的是什么版本的 Windows?
    • 我使用的是 Windows 7。
    • @Issam:是的,那么恐怕不可能有分层的子窗口。在 Windows 7 中,只有顶层窗口可以分层。
    猜你喜欢
    • 2021-02-08
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2019-05-27
    • 2019-12-01
    • 2016-09-13
    • 2023-04-09
    相关资源
    最近更新 更多