首页  编辑  

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

Tags: /超级猛料/VCL/Form,窗体/模态窗体/   Date Created:
这个问题以前讨论过,参考原猛料技巧1里面的帖子"一个ShowModal窗体的问题",不过那种情况对于自己编写的窗体还好处理,但是对于OpenDialog或者ColorDialog这样的系统标准窗体,那么怎么解决呢?
问题:我有一个OnTop窗体,重载了CreateParams,设置WndParent为GetDesktopWindow或者其他为其他窗体的句柄,这个时候在OnTop窗体上面显示TColorDialog就会有问题了:ColorDialog被OnTop窗体遮住了!
产生这个问题的原因在于Borland封装Execute的时候,设置了ColorDialog的WndParent为Application.Handle造成的,你查看TColorExecute的源代码就知道了。
因此我们只要修改ColorDialog的WndParent为OnTop窗体的Handle即可。解决方法有两个,一个是我们修改Dialogs.pas,另外一个采用别的方法来做。
修改Dialogs.pas比较麻烦,我们采用下面的方法即可,不过要注意哦,小心副作用!!!
var
 OldAppHandle:THandle;
 pAppHandle:^THandle;
begin      { HERE }
 OldAppHandle := Application.Handle;
 pAppHandle := @Application.Handle;  { Save Old App handle }
 pAppHandle^ := Self.Handle;
 try
   ColorDialog1.Color := Self.Color;
   if ColorDialog1.Execute then Self.Color := ColorDialog1.Color;
 finally
   PAppHandle^:= OldAppHandle; { Restore Old App Handle }
 end;
end;