我想创建一个透明面板,其中包含具有透明性的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.
答案 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
已经设置了扩展样式,因此它没有任何作用。