如果隐藏主窗体(窗体1)并显示另一个窗体(窗体2),则任务栏中将没有应用程序图标。有没有办法纠正这个问题,所以我也有子窗体的应用程序图标?

最佳答案

在下文中,当我指所有者时,我指的是Windows概念而不是VCL概念。

据我了解,您正在询问如何获取其他表单以在任务栏上具有一个按钮。安排顶级窗口在任务栏上有一个按钮的方法是:


使该窗口可见,无所有权,或者
使窗口可见,并具有WS_EX_APPWINDOW扩展窗口样式。


您的应用程序的主要形式Form1是无主的。当它可见时,它在任务栏上有一个按钮。

您的应用程序中的其他表单具有所有者。因此,它们在任务栏上没有按钮。

为了使其他表单在任务栏上具有按钮,您需要确保上面的两个选项均适用。这涉及覆盖CreateParams

type
  TForm2 = class(TForm)
  ....
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  ....
  end;
....
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := 0;
end;


上面给出了选项1。对于选项2,您可以这样编写:

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;




您在注释中询问此代码的放置位置。好吧,VCL表单是在Win32之上实现的。这意味着VCL表单被实现为顶级窗口。 Windows是通过调用CreateWindowEx来创建的,该调用接收各种参数。可能会在窗体的生命周期内重新创建Windows,这需要一些脚手架。

该支架的一部分是Windows VCL控件提供要传递给CreateWindowEx的参数的机制。这些参数在受保护的虚拟方法CreateParams中提供。您从不调用该方法,可以选择实现它。当需要了解CreateWindowEx所需的参数时,框架会调用它。

通常,VCL属性映射到传递给CreateWindowEx的参数(例如,窗口样式)。但是,对于我上面描述的两个选项,都没有这样的VCL属性。因此,您需要实现CreateParams

08-03 18:04
查看更多