如何在Delphi中的任务栏上显示透明且无边框的表单



我有一个带有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来实现这一点。

最新更新