如何使用TCustomTransparentControl创建透明控件?

时间:2018-12-14 14:04:58

标签: delphi

我想创建一个透明面板,其中包含具有透明性的PNG图像。我想将此面板放在其他面板之上,然后看到槽。
我有下面的代码,但它不接受控件。如果我取消注释行,则在将控件放在窗体上时,IDE会引发异常。

unit TransparentPanel5;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Vcl.Controls, ExtCtrls;

type
  TTransparentPanel5 = class(TCustomTransparentControl)
  private
  public
    constructor Create(AOwner: TComponent); override;
    procedure CreateParams(var Params: TCreateParams); override;
  end;

procedure Register;

implementation

constructor TTransparentPanel5.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  //ControlStyle := ControlStyle - [csSetCaption]+ [csAcceptsControls];
end;

procedure TTransparentPanel5.CreateParams(var Params: TCreateParams);
begin
     inherited CreateParams(Params);
    // Params.ExStyle := Params.ExStyle + WS_EX_Transparent;
    // ControlStyle   := ControlStyle - [csOpaque] + [csAcceptsControls]
end;


procedure Register;
begin
     RegisterComponents('His', [TTransparentPanel5]);
end;

end.

1 个答案:

答案 0 :(得分:5)

您有两个不相关的问题。我选择回答第二个。

IDE会引发AV,因为您无法正确应用扩展样式。您必须使用运算符进行设置。当您使用 + 时,您将样式位的值相加并最终得到完全不同的含义,在这种情况下,某些WS_EX_MDICHILD导致CreateWindowEx调用失败

应该是这样的:

procedure TTransparentPanel5.CreateParams(var Params: TCreateParams);
begin
     inherited CreateParams(Params);
     Params.ExStyle := Params.ExStyle or WS_EX_Transparent;
    // ControlStyle   := ControlStyle - [csOpaque] + [csAcceptsControls]
end;

请注意,由于TCustomTransparentControl已经设置了扩展样式,因此它没有任何作用。