两个子窗体设置了fsStayOnTop,他们都相对于主窗体总在最前,
但是我现在希望其中的一个子窗体,向对于另一个子窗体也总在最前。但是对于其他的程序不是总在最前的。
可以实现吗?怎样做呢?

解决方案 »

  1.   

    那你试试在一个窗体中调用另外一个窗体
    Form2.ShowModal;
      

  2.   

    我觉得你只要把你想要总在最前的那个窗体showmodal出来不就行了,不要show出来!
      

  3.   

    在form1的onActivate事件中写代码begin
      form2.ShowModal;
    end;
      

  4.   

    ShowModal之后,其他的窗体就不能操作了,就没有什么实际意义了?
    我需要的是这三个窗体(一个主窗体、两个子窗体),同时可以操作。
      

  5.   

    请你试试这个API函数 SetForegroundWindow
      

  6.   

    看看这段代码,我现在的程序就是用它悬浮在最顶层  
    //窗口悬浮最顶层
      with Form1 do
        SetWindowPos(Handle,
          HWND_TOPMOST,Left,Top,Width,Height,
            SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
      

  7.   

    其实很简单 
    在上面的窗口中
    procedure CreateParams(var Params: TCreateParams); override;procedure TfrmFront.CreateParams(var Params: TCreateParams);
    begin
      inherited;
      Params.WndParent := frmBottom.Handle;
    end;
      

  8.   

    SetWindowPos(Handle,
          HWND_TOPMOST,Left,Top,Width,Height,
            SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
    正解
      

  9.   

    graycarl的方法倒是可行,不过这样的话中间的窗体就是附属于主窗体了(Params.WndParent := frmBottom.Handle;),在要求上这是不可以的。应为两个子窗体都设置为fsStayOnTop,用chinafox的方法,这两个子窗体还是没有绝对顺序的,还是可以互为上下,所以也不行。
      

  10.   

    可以,只要你把这个悬浮窗口的父窗口设置为当前桌面就可以。桌面也是个窗口。Public  procedure Createparams(Var Params:TCreateParams);override;... procedure TFormDrop.Createparams(var Params:TCreateParams);begin  Inherited CreateParams(Params);  With Params do  begin  EXStyle:=ExStyle or WS_EX_TOPMOST OR WS_EX_ACCEPTFILES or WS_DLGFRAME  wndParnet:=GetDesktopWindow; //关键一行,用SetParent都不行!!  end;end; 
      

  11.   

    to cgm:
    这样可以吗?你的这个函数写在哪个窗体上阿?主窗体?还是第二个窗体,还是……
    要是主窗体设置成桌面,上面的控件都不显示了。我要达到的效果是:
    两个子窗体b、c的都相对于主窗体a总在最前,
    但是我现在希望其中的一个子窗体c,相对于另一个子窗体b也总在最前,不管焦点在哪个窗体上。但是对于其他的程序不是总在最前的。
    (不考虑MDI方式,不能把一个窗体的Parent设置为另一个窗体,因为这样不符合需求)
      

  12.   

    把A做B的创建父窗口,并把B设置为始终在前,再把B做C的创建父窗口,把C设置为始终向前。
    写法参考我前面写的代码。
      

  13.   

    to cgm:
    不能把一个窗体的Parent设置为另一个窗体,因为这样不符合需求。
      

  14.   

    不能把一个窗体的Parent设置为另一个窗体,因为这样不符合需求。???你们需求还管怎么编码实现?那我没办法了。
      

  15.   

    莫名其妙,能出效果就是
    什么不能把一个窗体的Parent设置为另一个窗体,简直就是废话
    程序能Run就是了,没人去看你的Code的按你的所谓要求是没解的。
      

  16.   

    to ly_liuyang:
    呵呵,一个窗体的Parent设置为另一个窗体的话,那这个窗体活动区域就局限于父窗体了,这个在设计上不符合需求,这很好笑吗?看来真的是没有解了。
      

  17.   

    设置Form的FormStyle ->fsStayOnTop
    覆盖Form的
      protected
        procedure CreateParams(var Params: TCreateParams); override;procedure TForm2.CreateParams(var Params: TCreateParams);
    begin
      inherited;
      with Params do
      begin
        Style := Params.Style xor WS_DLGFRAME;
        WndParent := 0;
      end;
    end;------------
    然后再Form的Create下面写
      SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
      

  18.   

    唉,去掉所有Stayontop//Form1
    procedure TForm1.CreateParams(var Params: TCreateParams);
    begin
      inherited;
      Params.WndParent := MainForm.Handle;
    end;
    //Form2
    procedure TForm2.CreateParams(var Params: TCreateParams);
    begin
      inherited;
      Params.WndParent := Form1.Handle;
    end;这样就是 Form1 Form2都在MainForm前
    而Form2在Form1前
    一般的工具窗口或者其它的ModalessDialog都是这样做的,我不太明白为什么不能符合你的要求
      

  19.   

    因为一个窗体的Parent设置为另一个窗体的话,那这个窗体活动区域就局限于父窗体了,还有AlphaBlend就失效了,而这样就在设计上不能满足需要。
      

  20.   

    TCreateParams.WndParent与TForm.Parent完全不是同一个概念
    你把我这段代码运行一下 就可以看到到底是怎样了
      

  21.   

    TCreateParams.WndParent对应于CreateWindow的hWndParent参数
    而这个参数对于层叠窗口而言只是表示它的Owner Window
    An owned window is an overlapped window that is destroyed when its owner window is destroyed or hidden when its owner is minimized; it is always displayed on top of its owner window. 只有WS_CHILD窗口的TCreateParams.WndParent才表示它的Parent
      

  22.   

    to graycarl:
    果然可以,谢谢指点!