Delphi 如何安排非主窗体与任务栏按钮关联?

Delphi 如何安排非主窗体与任务栏按钮关联?,delphi,delphi-xe4,Delphi,Delphi Xe4,如果隐藏主窗体(Form1)并显示另一个窗体(Form2),任务栏中将没有应用程序图标。有没有办法纠正这一点,使我的子表单也有应用程序图标?在下文中,当我提到所有者时,我指的是Windows概念,而不是VCL概念 据我所知,您正在询问如何让其他窗体在任务栏上有一个按钮。安排顶级窗口在任务栏上有按钮的方法是: 使窗口可见且无主,或 使窗口可见,并具有扩展窗口样式 应用程序的主窗体Form1,是无主窗体。当它可见时,它在任务栏上有一个按钮 应用程序中的其他表单具有所有者。因此,任务栏上没有按钮 为了

如果隐藏主窗体(Form1)并显示另一个窗体(Form2),任务栏中将没有应用程序图标。有没有办法纠正这一点,使我的子表单也有应用程序图标?

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

据我所知,您正在询问如何让其他窗体在任务栏上有一个按钮。安排顶级窗口在任务栏上有按钮的方法是:

  • 使窗口可见且无主,或
  • 使窗口可见,并具有扩展窗口样式
  • 应用程序的主窗体
    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表单被实现为顶级窗口。窗口是通过调用
    CreateWindowEx
    创建的,它接收各种参数。窗口可能会在窗体的生命周期内重新创建,这需要一些脚手架

    脚手架的一部分是windows VCL控件提供要传递给
    CreateWindowEx
    的参数的机制。这些参数在受保护的虚拟方法
    CreateParams
    中提供。您永远不会调用该方法,您可以选择实现它。框架在需要知道
    CreateWindowEx
    所需的参数时调用它


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

    您是否分配给Form2.Icon<代码>表单2.图标:=应用程序。图标在任务栏中显示但未显示。我认为您缺少图标,看起来您缺少任务栏按钮。可能是重复的想法告诉我在哪里实现所有这些?在您的表单中。您必须重写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;