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

WeG*_*ars 0 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.
Run Code Online (Sandbox Code Playgroud)

Ser*_*yuz 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;
Run Code Online (Sandbox Code Playgroud)

请注意,它TCustomTransparentControl已经设置了扩展样式,因此不会产生任何影响.