delphi – 使两种形式能够相互重叠?

我希望有一个单独的表单,与我的主表单“沿着”显示,因此它不会与主表单重叠.

这是一个例子:

请注意主程序如何重叠日志?我无法弄清楚如何在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 API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...