Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi t窗体父级设置为非nil值时的窗体透明度_Delphi - Fatal编程技术网

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)
中指定了所有者。我认为透明度是在顶级窗口中实现的。不适合儿童。如果你想在窗户上凿一个洞,你需要使用一个区域。顺便说一句,免费包括零支票。我打算将组件建立在一个表单上(因此设置父级),因为透明性是一个简单的选项,但它看起来只是它的顶层。看起来它必须是一个区域。。感谢您的输入。@Peter
t form.TransparentColorValue
是使用
WS\u EX\u LAYERED
窗口样式实现的,该样式仅在windows 8及更高版本的子窗口中受支持。另外,在重写的
Paint()
方法中设置
transparentColor值
是完全错误的,请改为在构造函数中进行设置。而
$1
是一种奇怪的透明度颜色,为什么不使用更像
clFuschia
的颜色呢?雷米-谢谢你的评论。同意在油漆内设置透明颜色的值是在错误的位置。我本以为TransparentColor值应该是一个不太可能用于其他任何用途的值。虽然1美元是一个奇怪的值,但考虑到它意味着透明度,这并不重要。读了一些书,看到了人们说不再需要区域的评论,这显然是错误的。透明度仅从整体上起作用,在具有父窗体的组件中没有任何用处。为什么要设置新窗体的父窗体?表单通常没有父级,只有所有者-您已经在
TNewForm.Create(Self)
中指定了所有者。我认为透明度是在顶级窗口中实现的。不适合儿童。如果你想在窗户上凿一个洞,你需要使用一个区域。顺便说一句,免费包括零支票。我打算将组件建立在一个表单上(因此设置父级),因为透明性是一个简单的选项,但它看起来只是它的顶层。看起来它必须是一个区域。。感谢您的输入。@Peter
t form.TransparentColorValue
是使用
WS\u EX\u LAYERED
窗口样式实现的,该样式仅在windows 8及更高版本的子窗口中受支持。另外,在重写的
Paint()
方法中设置
transparentColor值
是完全错误的,请改为在构造函数中进行设置。而
$1
是一种奇怪的透明度颜色,为什么不使用更像
clFuschia
的颜色呢?雷米-谢谢你的评论。同意在油漆内设置透明颜色的值是在错误的位置。我本以为TransparentColor值应该是一个不太可能用于其他任何用途的值。虽然1美元是一个奇怪的值,但考虑到它意味着透明度,这并不重要。读了一些书,看到了人们说不再需要区域的评论,这显然是错误的。透明度仅从整体上起作用,并且不会在具有作为表单的父级的组件中起任何作用。