如何让我的窗体始终位于主窗体之上?

5

如何使我的非模态表单始终保持在主窗体的顶部?

我已经尝试过:

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

这看起来很正常。这样做是正确的吗?


5
是的,这将起作用,因为Delphi 7没有引入在Delphi 2007中引入的TForm.PopupParent属性来解决此问题。 - Remy Lebeau
1个回答

5
这里介绍的是Win32中窗口所有权的概念。拥有者窗口始终显示在其所有者窗口之上。在调用CreateWindow时,指定了所有者并且无法进行修改。
在VCL中,您可以通过在CreateParams中设置WndParent来指定所有者,框架随后将其传递给CreateWindow。 VCL为您完成此操作,但在较旧的版本中,所有者处理存在一些问题。现代版本更好,并通过PopupMode和PopupParent属性允许更多的控制。
因此,您的代码将产生您期望的效果。

谢谢。然而我遇到了一个奇怪的行为,当我最小化主窗体时,所有其他窗体仍然可见于桌面上,而不是“隐藏”。这个问题有解决方法吗? - Vlad
1
按照我在你另一个问题的答案建议做,但在主窗体中处理 WM_SYSCOMMAND 并隐藏所有其他窗口。您可能需要记住它们的状态,以便在窗口恢复时可以将它们还原回来。我在 D6 上进行了测试,我认为它与 D7 非常相似。但它确实很糟糕。现代 Delphi 更好。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接