4

我想要一个表格,当我设置在 z 顺序的底部时,它会保留在那里。我试过:

SetWindowPos(Handle,HWND_BOTTOM,Left,Top,Width,Height,SWP_NOZORDER);

当我将它与其他一些应用程序重叠时,它会根据需要保持在底部。但是,当我单击它时,它会上升到顶部。然后我尝试了:

SetWindowPos(Handle, HWND_BOTTOM, Left, Top, Width, Height,
             SWP_NOACTIVATE or SWP_NOZORDER);

以及来自该网站的各种其他开关... http://msdn.microsoft.com/en-us/library/ms633545.aspx

但它仍然上升到顶部。

4

3 回答 3

9

SetWindowPos仅在调用窗口时设置窗口的位置,它不建立状态。处理WM_WINDOWPOSCHANGING是执行此操作的正确方法:

在处理此消息时,修改 WINDOWPOS 中的任何值都会影响窗口的新大小、位置或 Z 顺序中的位置。应用程序可以通过设置或清除 WINDOWPOS 的标志成员中的适当位来防止更改窗口。


type
  TForm1 = class(TForm)
    ..
  private
    procedure WindowPosChanging(var Msg: TWMWindowPosMsg);
        message WM_WINDOWPOSCHANGING;
  end;

..

procedure TForm1.WindowPosChanging(var Msg: TWMWindowPosMsg);
begin
  if Msg.WindowPos.flags and SWP_NOZORDER = 0 then
    Msg.WindowPos.hwndInsertAfter := HWND_BOTTOM;
  inherited;
end;
于 2011-11-26T02:02:04.697 回答
1

从来没有尝试过,但你可能会在某个地方捕获消息 WM_WINDOWPOSCHANGING,并使用 Z 顺序玩弄。不过可能会变得复杂,我个人会觉得它非常不标准。

与 cassade 等效但具有 z 顺序排序的菜单选项可能是更好的选择,我的意思是,如果他们单击它,他们希望看到它。

于 2011-11-26T01:40:19.730 回答
0

出于本能,我不相信该应用程序将始终按您的预期工作。其他应用程序可能有更严格的方法来强制将其自身置于您的前面,反之亦然,将其发送到后面。例如,一个将窗口重复发送到后面的计时器。然后,如果你有两个这样的应用程序分层,你会看到它们互相争斗,基本上来回闪烁。最后,我不会指望一个永久的 100% 解决方案,因为你永远不知道其他应用程序可能会做什么来覆盖你的。

于 2011-11-26T15:29:51.360 回答