关于窗口的激活,该如何解决
关于窗口的激活
我用CWinthread + CWnd做了个启动窗口,用于显示动画,sleep()一段时间后,结束该窗口线程,再显示主窗口,程序加在CXXApp的初始化函数中,但是显示的主窗口不直接显示出来,每次都得在任务栏点一下才能显示出来,怎么才能解决这个问题呢?
意思是窗口线程退出后不能激活后续创建的主窗口,每次都是显示程序启动前的最后一个活动窗口
------解决方案--------------------
说说我的观点,我也经常在程序启动时显示一个欢迎窗口,我的做法是直接从CDialog派生一个类,在CWinApp派生类的OnInitInstance函数中主对话框建立之前先DoModal我的欢迎窗口,这样不会出现楼主所说的问题。
楼主说的问题我猜想是用到了多线程,这里不再说是否的合适的问题了。
我不知道你的欢迎窗口到底是在哪儿结束的?结束以后到底干了什么?
我给你一个解决办法:当你的欢迎窗口结束以后,使用下面的代码强制将你的主窗口放在最前面。如下:
我用CWinthread + CWnd做了个启动窗口,用于显示动画,sleep()一段时间后,结束该窗口线程,再显示主窗口,程序加在CXXApp的初始化函数中,但是显示的主窗口不直接显示出来,每次都得在任务栏点一下才能显示出来,怎么才能解决这个问题呢?
意思是窗口线程退出后不能激活后续创建的主窗口,每次都是显示程序启动前的最后一个活动窗口
------解决方案--------------------
说说我的观点,我也经常在程序启动时显示一个欢迎窗口,我的做法是直接从CDialog派生一个类,在CWinApp派生类的OnInitInstance函数中主对话框建立之前先DoModal我的欢迎窗口,这样不会出现楼主所说的问题。
楼主说的问题我猜想是用到了多线程,这里不再说是否的合适的问题了。
我不知道你的欢迎窗口到底是在哪儿结束的?结束以后到底干了什么?
我给你一个解决办法:当你的欢迎窗口结束以后,使用下面的代码强制将你的主窗口放在最前面。如下:
- C/C++ code
UINT nCmdShow = SW_SHOW; if (!IsWindowVisible()) nCmdShow = SW_SHOW; else if (IsIconic()) nCmdShow = SW_RESTORE; ShowWindow(nCmdShow); SetForegroundWindow(); //如果只是在任务栏上闪烁,则使用暴力手段把你的程序切换到前台. if(GetForegroundWindow()!=this) { CRect rc; GetWindowRect( rc ); //先切换到最前面 SetWindowPos(&wndTopMost ,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); //模拟鼠标单击标题栏获得焦点 mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN,rc.left+1,rc.top+1,0,0); Sleep(1); mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP,rc.left+1,rc.top+1,0,0); //取消TOPMOST属性 SetWindowPos(&wndNoTopMost ,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); //再次切换到前面 SetForegroundWindow(); }