SetWindowPos(Handle,HWND_TOPMOST,Self.Left,Self.Top,Self.Width,Self.Height,SWP_SHOWWINDOW)这个函数对程序的主窗体能使其一直居于所有窗体之上,但对于非程序主窗体的其他窗体则不起作用了。不知道是什么原因?能用什么方法才能使程序的非主窗体也能居于所有窗体之前?而且让用户能改变这个窗体是否一直居于所有窗体的前面。

解决方案 »

  1.   

    何使Form位于所有窗体最前   在设计程序界面时,有时要求某一窗体不能被任何其它窗体遮盖,即使它失去焦点。对于应用程序主窗体来说,可以通过在物体属性栏(Object Inspector)
    中设置窗体的FormStyle属性为fsStayOnTop来实现;但是对于多窗体应用程序(MDI)中主窗体产生的子窗体而言,这一方法的效果是相对有限的,因为此法只能
    使该子窗体位于本应用程序其它窗体的最前端,当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;普通的处理方式为:
        SetWindowPos(handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
        SetWindowPos(handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);给分一定行 hehe^^