这个问题以前讨论过,参考原猛料技巧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
OldAppHandle := Application.Handle;
pAppHandle := @Application.Handle;
pAppHandle^ := Self.Handle;
try
ColorDialog1.Color := Self.Color;
if ColorDialog1.Execute then Self.Color := ColorDialog1.Color;
finally
PAppHandle^:= OldAppHandle;
end;
end;