【发布时间】:2015-06-04 18:06:33
【问题描述】:
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
TForm2 = class(TForm)
private
FAppWindow: Boolean;
protected
procedure CreateParams(var Params: TCreateParams); override;
public
property AppWindow: Boolean read FAppWindow write FAppWindow;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form2 := TForm2.Create(Self);
Form2.AppWindow := True;
Form2.Show;
end;
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
if FAppWindow then begin
Params.Style := Params.Style or WS_EX_APPWINDOW;
Params.WndParent := 0;
end;
end;
这样不行,因为窗口句柄是在TForm的构造过程中创建的,所以CreateParams运行得太早了,FAppWindow总是False。
编写自定义构造函数也不起作用,因为您最终必须调用创建句柄的继承构造函数,然后才能将任何数据保存到实例:
constructor TForm2.CreateAppWindow(AOwner: TComponent);
begin
inherited Create(AOwner);
FAppWindow := True;
end;
有没有办法:
- 延迟创建窗口句柄?
- 创建窗口句柄后更改窗口样式?
- 在构造函数运行后重新创建窗口句柄?
- 我还没有想到其他选项?
如何从类的“外部”更改表单的样式?
【问题讨论】:
-
为该属性编写一个设置器,它将
RecreateWnd。 -
或者,如果您不想重新创建窗口,您可以执行
ChangeAppWindow内部过程所做的事情。它通过SetWindowLong在一对ShowWindow调用中设置样式(SW_HIDE和SW_SHOW或SW_MINIMIZE对)。我更喜欢在这里重新创作。
标签: delphi window delphi-xe2 vcl