我有一个带有bsNone Borderstyle的透明窗体。为了在任务栏上显示图标,我在创建过程中添加了以下代码:
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_APPWINDOW);
end;
这样,会显示图标,但透明度不起作用。有什么建议吗?谢谢
窗口样式,扩展的和标准的,是位标志集。您已经设置了WS_EX_APPWINDOW
扩展样式,但清除了所有其他扩展样式。您想要做的是使用位OR将WS_EX_APPWINDOW
扩展样式与现有的扩展样式相结合。
ExStyle := GetWindowLong(Form.Handle, GWL_EXSTYLE);
SetWindowLong(Form.Handle, GWL_EXSTYLE, ExStyle or WS_EX_APPWINDOW);
但是,调用SetWindowLong
是错误的方法。Delphi窗口可能会被重新创建,当它们被重新创建时,样式会被重新应用。因此,代码的正确位置是在重写的CreateParams
方法中。
procedure TMyForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
然而,设置WS_EX_APPWINDOW
通常是将按钮放在任务栏上的错误方式。只要窗口是无主的,它就会在任务栏上有一个按钮。您可以通过在CreateParams
中将MainFormOnTaskbar
设置为True
或将WndParent
设置为0来实现这一点。