如何安排非主表单与任务栏按钮关联?

时间:2014-04-27 15:39:35

标签: delphi delphi-xe4

如果隐藏主窗体(Form1)并显示另一个窗体(Form2),则在任务栏中没有应用程序图标。有没有办法纠正这个,所以我也有儿童表格的应用程序图标?

1 个答案:

答案 0 :(得分:2)

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

据我所知,你问的是如何让你的另一个表单在任务栏上有一个按钮。安排顶层窗口在任务栏上有一个按钮的方法是:

  1. 使窗口可见,无主,或
  2. 使窗口可见,并具有WS_EX_APPWINDOW扩展窗口样式。
  3. 您的应用程序的主要形式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