如果隐藏主窗体(窗体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
。