在使用WINAMP时,我们点下置顶,则WINAMP的主窗口、列表窗口、均衡窗口等都会置顶。我弄了个软件,其中有两个窗口,我使用Form1.FormStyle:=fsStayOnTop;Form2.FormStyle:=fsStayOnTop;并不能实现两个窗口都置顶。我在:
Application.OnDeactivate加入
Form1.FormStyle:=fsNormal;
Form1.FormStyle:=fsStayOnTop;
Form2.FormStyle:=fsNormal;
Form2.FormStyle:=fsStayOnTop;
后,勉强可以置顶,但每次application失去焦点时就会产生一次或多次闪烁,给人一种很不爽的感觉。我在此发过两次帖子奢求指教均未能得到解决方法,我自己“研究”多时也无法找到较好的解决方法,所以
我非常非常迫切您能够给予帮助、指教!或者花点时间帮我试下要怎么实现,好吗?如蒙指教,定当感激不尽!!

解决方案 »

  1.   

    使该子窗体位于本应用程序其它窗体的最前端,当Windows 95桌面上别的应用程序窗体获得焦点后仍可以将其遮盖。如果您需要应用程序子窗体拥有绝对的位于
    所有窗体最前的能力时,可以参照下法进行(假定由主窗体事件产生的子窗体为Form2,对应的程序组名为Unit2):   1.在Unit2中窗体类声明public段下定义一个处理过程:   procedure AppBringtoTop(Sender:TObject);   2.在Form2的oncreate事件中加入*句如下:   procedure Tform2.FormCreate(Sender:TObject);   begin    Application.OnDeactivate :=AppBringtoTop; //*   end;   3.编写AppBringtoTop过程程序如下:   procedure TForm2.AppBringtoTop(Seader:TObject);   begin    SetactiveWindow(Handle); //API函数,将本窗体提至最前   end;   ●说明:Application是Delphi对用户创建的应用程序的封装,为TApplication类,如同TForm等一样,TApplication也有其自己的属性与事件定义,其中
    Application.OnDeactivate事件在用户开启其他应用程序而将会使本应用程序为Deactivate时产生,正确地对该事件编程即可实现本窗体(Form2)始终位于最前;
    另外由于TApplication是不可见控件,同时它的属性与事件均没有列入物体属性栏中,因而需要在程序段中编写代码来进行描述。编写TApplication的事件过程
    时要按下述原则进行:A在执行段implementation中编写好事件处理过程;B在interface段中声明该事件处理过程;C在该窗体的FormCreate事件中定义所
    需的Application事件响应为B中声明的过程名。
    以下是在我的LabelFormUnit中使用的方法
    procedure TLabelForm.FixupButClick(Sender: TObject);
    begin
      if FixupBut.Down then
        self.FormStyle := fsStayOnTop
      else
        self.FormStyle := fsNormal;
    end;procedure TLabelForm.FormCreate(Sender: TObject);
    begin
      Application.OnDeactivate :=AppBringtoTop;
    end;procedure TLabelForm.AppBringtoTop(Sender: TObject);
    begin
      SetActiveWindow(self.Handle);
    end;
      

  2.   

    哦,对了,我那个FixupBut是个SpeedButton ^^! 不好意思哦
      

  3.   

    我想使用窗体的BingToFront方法应该是更简单
    procedure TfrmFireDeploy.btnBestMapClick(Sender: TObject);
    begin
      Timer1.Enabled := true;
      frmMain.BringToFront;
    end;procedure TfrmFireDeploy.Timer1Timer(Sender: TObject);
    begin
        frmMainBuild.BringToFront;
        Self.BringToFront;
        Timer1.Enabled := false;
    end;
      

  4.   

    把创建的子窗体的父窗体改成nil,
    然后SetWindowPos,这样也行吧。
      

  5.   

    win32中只能有一个窗口置顶。
      

  6.   

    我曾经这样做过,我的程序有两个窗口,分别在屏幕的不同地方,不会重叠,将两个窗口都设为fsStayOnTop,主窗口的visible设为false,但因为是主窗口,程序运行时还是会出现,而且两个窗口切换时会一个在顶层,一个在次顶层。我记得是这样,因为什么不知道,你可以试试。