一个以前用VFP9开发的程序,在维护中收到客户不断地抱怨,原因是当多个模态表单层叠(一个模态表单中又DO FORM另一个模态表单)时,如果此时通过任务栏切换到其它应用程序的窗口或者单击当前活动模态窗口在任务栏上的图标使其最小化到任务栏上后,当再次激活该应用程序在任务栏上的图标时,原本最顶层的那个模态表单竟然“躲”到调用者表单的后面,也就是说本应该在最上面的那个模态表单竟然被调用者的窗口给覆盖了,导致的后果就是应该接收鼠标或键盘操作的表单被隐藏起来了,无法响应鼠标或键盘操作,当然就不能关闭;而显示的这个表单却中看不中用,也无法关闭。最终的结局是用户必须使用任务管理器强行Kill。
所有模态表单的设置均采用如下设置:
ShowWindow = 1 &&In Top-level Form
WindowType = 1 &&Modal
ShowTips = .T.
AlwaysOnTop = .F. &&默认值
Desktop = .T.
尝试过的方法如下(在所有模态表单的init()事件中):
1.调用模态表单的ZOrder(0)方法以及设置表单的AlwaysOnTop = .T.;
2.调用WIN API SetForegroundWindow(THISFORM.hWnd);
3.调用WIN API SetWindowPos函数。具体参数为:
#define HWND_TOP 0 &&仅限于进程内所有窗口的最顶层窗口
#define HWND_TOPMOST -1 &&不分应用程序,成为所有窗口的最顶层窗口
#define SWP_NOSIZE 0x0001
#define SWP_NOMOVE 0x0002
#define SWP_SHOWWINDOW 0x0040
LOCAL nFlag as Integer
nFlag = BITOR(SWP_NOMOVE,SWP_NOSIZE,SWP_SHOWWINDOW)
=SetWindowPos(THISFORM.hwnd,HWND_TOPMOST,0,0,0,0,nFlag)
以上三种方法均无法100%解决问题,当快速频繁点击任务栏上VFP应用程序的图标使其在最小化与还原之间切换时,还会偶尔发生原本最顶层的模态表单被调用者窗口遮蔽的情况。
而在VC++中无论级联调用多少个模态对话框均不会出现最后一个对话框被前一个遮挡住的情况。看来应该是VFP的问题。
CMyDialog dlg;
dlg.DoModal();
有人遇到过此种情况吗?怎么解决?