禁用表单上升到顶部

时间:2011-11-26 00:59:27

标签: forms delphi z-order

我想要一个表单,当我设置在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

但它仍然升至顶峰。

3 个答案:

答案 0 :(得分:8)

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

  

正在处理此消息,修改其中的任何值   WINDOWPOS会影响窗口在Z中的新大小,位置或位置   订购。应用程序可以通过设置或阻止更改窗口   清除WINDOWPOS的flags成员中的相应位。


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;

答案 1 :(得分:1)

从未尝试过,但你可能会在某处捕获WM_WINDOWPOSCHANGING消息,然后用Z顺序进行调整。可能会变得复杂,我个人会发现它非常不合标准。

一个菜单选项相当于cacsade但是有一个z顺序排序可能是一个更好的选择,我的意思是如果他们点击它,他们希望看到它。

答案 2 :(得分:0)

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