我正在使用Delphi 2010构建在Windows XP/Vista和Windows 7上运行的Win32 GUI应用程序.
基本上,Application.MainForm是一个只读属性,一旦通过Application.CreateForm创建第一个表单,就无法在运行时更改:
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)
上面的例子将Form1作为应用程序的mainform.它将显示在Windows 7任务栏的缩略图预览中.
在运行时将Application.MainFormOnTaskBar设置为true允许我们享受Windows aero主题功能.
我需要在运行时切换应用程序的mainform.例如,将Form2设置为主窗体.我使用以下代码使其工作:
procedure SetAsMainForm(aForm:TForm);
var
P:Pointer;
begin
Application.MainFormOnTaskBar := False;
try
P := @Application.Mainform;
Pointer(P^) := aForm;
aForm.Show;
finally
Application.MainFormOnTaskBar := True;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetAsMainForm(Form2);
end;
Run Code Online (Sandbox Code Playgroud)
执行Button1.Click将使Form2成为主窗体并更新Windows的任务栏缩略图预览.但是,任务栏可能会闪烁切换.
我的问题是:
主要形式不是你可以在Delphi中改变的东西.你设法找到了一种似乎在中途工作的方法,但这是一个黑客攻击.别那样做.
应用程序只有一个主窗体,它是第一个完成创建的窗体CreateForm.如果主窗体需要两种完全不同的行为,那么您可以尝试几种技术:
将两种主要形式定义为框架.把你所有的功能放在那里.然后定义一个单独的表单,作为两个帧之一的父表单.而不是切换主窗体,只需破坏框架并用新的框架替换它.
与框架解决方案类似,但使用表单.创建表单,并将Parent属性设置为"真正的"主表单.这可能会有较低的初始成本,因为你已经有两种形式,但根据我的经验,重新表示形式比框架更脆弱,框架是为儿童控件设计的,所以更喜欢框架技术.
任务栏上的闪烁来自一种形式消失而另一种形式出现.使用上述任何一种技术,总是只有一种形式,而不是两种形式,所以没有任何东西可以闪烁.
另一个需要考虑的选择是设置MainFormOnTaskbar=False,然后在进程的生命周期中创建一个隐藏的MainForm,并拥有Form1并Form2成为您创建的辅助表单,并在需要时动态释放,并通过覆盖TForms.CreateParams()方法为其提供自己的任务栏按钮,例如:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Params.WndParent := GetDesktopWindow;
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7255 次 |
| 最近记录: |