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
。如何在構造函數運行後設置CreateParams?
編寫自定義構造函數也不起作用,因爲最終你必須要調用繼承的構造它創建之前,你可以將任何數據保存到該實例的句柄:
constructor TForm2.CreateAppWindow(AOwner: TComponent);
begin
inherited Create(AOwner);
FAppWindow := True;
end;
有沒有一種辦法:
- 推遲創建窗口句柄?
- 創建窗口句柄後改變窗口樣式?
- 構造函數運行後重新創建窗口句柄?
- 其他一些選項我沒有想過,但呢?
如何從類的「外部」改變表單的樣式?
寫二傳手該屬性即會'RecreateWnd'。 – TLama 2015-03-31 11:56:07
或者,如果您不想重新創建窗口,則可以執行'ChangeAppWindow'內部過程的操作。它通過'SetWindowLong'在一對'ShowWindow'調用('SW_HIDE'和'SW_SHOW'或'SW_MINIMIZE'對)內設置樣式。我寧願在這裏重新創作。 – TLama 2015-03-31 15:00:59