由于程序运行前要启动一些动态库,耗费时间,因此使用自带的splash 。但是splash启动时,应用程序框架也出现。我向实现splash单独出现后,应用程序框架再出现。因此采用了网上一位老兄的方法:
1.在程序的APP类中将InitInstance()函数中的
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
改写为 m_pMainWnd->ShowWindow(SW_HIDE);
即初始时便让窗口不显示。
2.在CSplashWnd类的OnTimer函数中添加此句话:
AfxGetMainWnd()->ShowWindow(SW_SHOW);//显示主框架
问题来了:
由于我采用的是窗口最大化,即上面的SW_SHOW是SW_SHOWMAXIMIZED,因此,每次运行程序的时候:出现splash窗口后,会飞快地有一个应用程序窗口(最大化之前的框架)飞快一闪,然后才出现最大化的应用程序窗口。
我就跟踪了一下,发现,即便不加入splash,在CXXXAPP的InitInstance函数中,注释掉
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
依然出现应用程序窗口,估计这是问题所在。但是如何解决?
1.在程序的APP类中将InitInstance()函数中的
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
改写为 m_pMainWnd->ShowWindow(SW_HIDE);
即初始时便让窗口不显示。
2.在CSplashWnd类的OnTimer函数中添加此句话:
AfxGetMainWnd()->ShowWindow(SW_SHOW);//显示主框架
问题来了:
由于我采用的是窗口最大化,即上面的SW_SHOW是SW_SHOWMAXIMIZED,因此,每次运行程序的时候:出现splash窗口后,会飞快地有一个应用程序窗口(最大化之前的框架)飞快一闪,然后才出现最大化的应用程序窗口。
我就跟踪了一下,发现,即便不加入splash,在CXXXAPP的InitInstance函数中,注释掉
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
依然出现应用程序窗口,估计这是问题所在。但是如何解决?
1.在程序的APP类中将InitInstance()函数中的
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
改写为 m_pMainWnd->ShowWindow(SW_HIDE);
即初始时便让窗口不显示。
//////////////////////////////////////////////////
你的这个问题,其实质在于:1)m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); 语句的使命在于将创建并已经注册的窗口(如果创建时窗口风格为sw_hide)显示并且重绘,结果是把主窗口显示在屏幕上.而改写为 m_pMainWnd->ShowWindow(SW_HIDE); 的意图则是创建时窗口风格已经是SW_SHOW,而希望暂时不显示在屏幕上.两者有所区别.2.AfxGetMainWnd()函数在这种情况下相当于直接调用m_pMainWnd,也就是说,与m_pMainWnd->ShowWindow(SW_SHOW); 等价.所以才会出现你说的现象.
放到什么地方?
大家都没有仔细看我的问题,
“我就跟踪了一下,发现,即便不加入splash,在CXXXAPP的InitInstance函数中,注释掉
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
依然可以正常出现应用程序窗口,估计这是问题所在。但是如何解决? ”
要想启动不显示
可以这么解决
this->m_nCmdShow=SW_HIDE;
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(Clsdi1Doc),
RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
RUNTIME_CLASS(Clsdi1View));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
怎么可能呢?我这就没问题。基本不需要加代码啊
你可以把默认的加是CMainFrame里面的 CSplashWnd::ShowSplashScreen(); 放在APP类里面的初始化函数里面,在框架生成事前,不过得改成 CSplashWnd::ShowSplashScreen(AfxGetMainWnd()); 这样绝对没问题。我刚刚就试验了下。
感谢楼上对我的问题持续关注!
我也刚刚做过试验,建立一个vcSDI程序后,唯一添加splash,按照楼上的方法,进行了修改。应用程序框架和splash屏依然同时出现,感兴趣的朋友可以测试一下。
最简单的就是,在CSplashWnd类的OnTimer函数里面完成主窗口的创建,同时KillTimer