Delphi t窗体父级设置为非nil值时的窗体透明度
如果动态创建窗体并将其父窗体设置为父窗体,为什么透明度不起作用。如果父级为零,则透明度正常。我希望使用透明度而不是区域来创建非矩形组件 我看到,如果父窗体透明度处于启用状态,并且其值设置为与子窗体相同的值,那么它可以正常工作,但您看到的是父窗体下的内容,而不是父窗体上的内容 谢谢Delphi t窗体父级设置为非nil值时的窗体透明度,delphi,Delphi,如果动态创建窗体并将其父窗体设置为父窗体,为什么透明度不起作用。如果父级为零,则透明度正常。我希望使用透明度而不是区域来创建非矩形组件 我看到,如果父窗体透明度处于启用状态,并且其值设置为与子窗体相同的值,那么它可以正常工作,但您看到的是父窗体下的内容,而不是父窗体上的内容 谢谢 unit Unit66; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.C
unit Unit66;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls;
type
TNewForm = class(TForm)
public
constructor Create(AOwner: TCOmponent); override;
protected
procedure Paint; override;
end;
TForm66 = class(TForm)
Button1: TButton;
cbSetParent: TCheckBox;
procedure Button1Click(Sender: TObject);
private
Nf: TNewForm;
{ Private declarations }
public
{ Public declarations }
end;
var
Form66: TForm66;
implementation
{$R *.dfm}
constructor TNewForm.Create(AOwner: TComponent);
begin
inherited CreateNew(AOwner);
Self.Color := $1;
Paint;
end;
procedure TNewForm.Paint;
begin
inherited Paint;
Self.Canvas.Pen.Color := clBlack;
Self.Canvas.Brush.Color := clRed;
Self.Canvas.RoundRect(30, 30, Self.ClientWidth - 30, Self.ClientHeight - 30, 20, 20);
Self.TransparentColorValue := $1;
Self.TransparentColor := True;
end;
procedure TForm66.Button1Click(Sender: TObject);
begin
if Assigned(Nf) then
Nf.Free;
Nf := TNewForm.Create(Self);
if CbSetParent.Checked then
Nf.Parent := Self
else
Nf.Parent := nil;
Nf.Visible := True;
end;
end.
为什么要设置新表单的
父项
?表单通常没有父级,只有所有者-您已经在TNewForm.Create(Self)
中指定了所有者。我认为透明度是在顶级窗口中实现的。不适合儿童。如果你想在窗户上凿一个洞,你需要使用一个区域。顺便说一句,免费包括零支票。我打算将组件建立在一个表单上(因此设置父级),因为透明性是一个简单的选项,但它看起来只是它的顶层。看起来它必须是一个区域。。感谢您的输入。@Petert form.TransparentColorValue
是使用WS\u EX\u LAYERED
窗口样式实现的,该样式仅在windows 8及更高版本的子窗口中受支持。另外,在重写的Paint()
方法中设置transparentColor值
是完全错误的,请改为在构造函数中进行设置。而$1
是一种奇怪的透明度颜色,为什么不使用更像clFuschia
的颜色呢?雷米-谢谢你的评论。同意在油漆内设置透明颜色的值是在错误的位置。我本以为TransparentColor值应该是一个不太可能用于其他任何用途的值。虽然1美元是一个奇怪的值,但考虑到它意味着透明度,这并不重要。读了一些书,看到了人们说不再需要区域的评论,这显然是错误的。透明度仅从整体上起作用,在具有父窗体的组件中没有任何用处。为什么要设置新窗体的父窗体?表单通常没有父级,只有所有者-您已经在TNewForm.Create(Self)
中指定了所有者。我认为透明度是在顶级窗口中实现的。不适合儿童。如果你想在窗户上凿一个洞,你需要使用一个区域。顺便说一句,免费包括零支票。我打算将组件建立在一个表单上(因此设置父级),因为透明性是一个简单的选项,但它看起来只是它的顶层。看起来它必须是一个区域。。感谢您的输入。@Petert form.TransparentColorValue
是使用WS\u EX\u LAYERED
窗口样式实现的,该样式仅在windows 8及更高版本的子窗口中受支持。另外,在重写的Paint()
方法中设置transparentColor值
是完全错误的,请改为在构造函数中进行设置。而$1
是一种奇怪的透明度颜色,为什么不使用更像clFuschia
的颜色呢?雷米-谢谢你的评论。同意在油漆内设置透明颜色的值是在错误的位置。我本以为TransparentColor值应该是一个不太可能用于其他任何用途的值。虽然1美元是一个奇怪的值,但考虑到它意味着透明度,这并不重要。读了一些书,看到了人们说不再需要区域的评论,这显然是错误的。透明度仅从整体上起作用,并且不会在具有作为表单的父级的组件中起任何作用。