delphi - 使 2 个表格能够相互重叠?

标签 delphi forms vcl tform

我想要一个单独的表单,与我的主表单“一起”显示,这样它就不会与主表单重叠。

这是一个示例:Example

注意主程序如何重叠日志?我不知道如何在 Delphi 中做到这一点。

谢谢!

最佳答案

这个问题的答案就在非常有用的 Window Features 中。 MSDN 主题。

相关信息是:

An overlapped or pop-up window can be owned by another overlapped or pop-up window. Being owned places several constraints on a window.

  • An owned window is always above its owner in the z-order.
  • The system automatically destroys an owned window when its owner is destroyed.
  • An owned window is hidden when its owner is minimized.

应用程序中的主窗体是其他弹出窗口的所有者(使用 Windows 术语而不是 Delphi 术语)。上面的第一个要点意味着拥有的窗口始终出现在主窗体(所有者)上方。

尝试创建一个包含 3 个表单的应用程序并显示所有表单。 .dpr 看起来像这样:

program OwnedWindows;

uses
  Forms,
  Main in 'Main.pas' {MainForm},
  Popup1 in 'Popup1.pas' {PopupForm1},
  Popup2 in 'Popup2.pas' {PopupForm2};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TMainForm, Main);
  Application.CreateForm(TPopupForm1, PopupForm1);
  Application.CreateForm(TPopupForm2, PopupForm2);
  PopupForm1.Show;
  PopupForm2.Show;
  Application.Run;
end.

您将看到主窗体始终位于其他两个窗体的下方,但这些其他拥有的窗体可以位于彼此的上方或下方。当您最小化主窗体时,它们都会消失。

如果您想让所有表单成为顶级无主窗口,您可以:

procedure TPopupForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := 0;
end;

在我的示例中,TPopupForm2 也是如此。这将导致所有 3 个窗口都有任务栏按钮。

另一种方法是恢复到 Vista 之前的方式,并使应用程序的隐藏窗口成为顶级所有者窗口。您可以通过确保 Application.MainFormOnTaskbar 为 False 来完成此操作。跳过所有 CreateParams 代码,您现在将在任务栏上看到一个窗口,并且任何窗口都可以位于任何其他窗口之上,因为顶级所有者窗口是隐藏窗口 Application.Handle。当然,缺点是你失去了 Aero Peek。

所以,我猜你需要做的是让主窗体像往常一样出现在任务栏上,但确保其他窗体不属于主窗体(在 Windows 意义上)。但需要拥有它们以避免它们出现在任务栏中。因此,您可以使用 CreateParams 方法使隐藏的应用程序窗口成为所有者,如下所示:

procedure TOverlappedPopupForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := Application.Handle;
end;

尽管您在评论中另有说明,但当我这样做时,我发现当我最小化主窗体时,弹出窗体确实被隐藏了。当主窗体恢复时,它会再次显示。因此我认为这确实完全解决了您的问题。

关于delphi - 使 2 个表格能够相互重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5393666/

相关文章:

arrays - 数组类型可以有方法吗?

delphi - 编写属性编辑器 - 我需要一些指导

javascript - 值为 <input type ="text"> 的单选按钮

javascript - 将数据传递到表单域

forms - Delphi 在应用程序运行时更改主窗体

delphi - 如何静态链接 Indy SSL 文件?

delphi - FindComponent 在过程中不起作用

php - 动态传递 PHP 变量

delphi - 如何为窗体的标题栏、系统菜单图标以及最小化、最大化和关闭按钮设置自定义光标?

c++ - 从另一个 .cpp 文件调用函数