首页  编辑  

如何在OnTop窗体上面显示一个模态窗体

Tags: /超级猛料/VCL/Form,窗体/模态窗体/   Date Created:
应该这样显示模态窗体:
application.NormalizeAllTopMosts;
ModalForm.ShowModal;
Application.RestoreTopMosts;
使用Delphi本身提供的切换OnTop的属性,可能造成窗体闪烁,可以用API来代替:
SetWindowPos(handle,hwnd_topmost,0,0,0,0,swp_nomove or swp_nosize);//Set
SetWindowPos(handle,hwnd_notopmost,0,0,0,0,swp_nomove or swp_nosize);//Unset
但是这个方法不适合于二级窗体。
OnTop窗体的一个问题:
Kingron:
例如一个Form1,Form2,Form1中调用Form2:
Hide;
form2.ShowModal;// or Show
这个时候,Form2是不能OnTop的。必须修改代码如下:
try
   Hide;
   Application.NormalizeAllTopMosts;
   LitterWin.ShowModal;
   Application.RestoreTopMosts;
finally
   show;
end;
而且,在Form2的OnShow中,必须添加代码:
SetWindowPos(handle, hwnd_topmost, 0, 0, 0, 0, swp_nomove or swp_nosize);
也有这种情况:
MainForm为OnTop窗体,在MainForm上面ShowModal一个模态窗体,这个时候,整个程序都不是OnTop了,随便一个窗口就可以遮住程序,如何解决这个问题呢?
有几个方法,请参考其他的文章,这里给出一个好的安全的方法:
修改Modal窗体,重载CreateParams:

procedure TForm2 . CreateParams ( var Para : TCreateParams );

begin

  inherited ;

 Para . WndParent := Application . MainForm . Handle ;

end ;

同时在Form2的OnShow中添加如下代码:

procedure TForm2 . FormShow ( Sender : TObject );

begin

 EnableWindow ( Application . Handle , True );

end ;