由于程序运行前要启动一些动态库,耗费时间,因此使用自带的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.   

    把窗口设置为无边框风格,响应WM_ERASEBKGND消息直接返回TRUE,取屏幕大小,用MoveWindow是窗口充满整个屏幕。
      

  2.   

    如果你的是单文档或者多文档程序 可以直接用组件库里面的splash,至于图象你可以自己更改。
      

  3.   

    回答如下:
    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); 等价.所以才会出现你说的现象.
              
      

  4.   

    你的问题解决的方法也很简单:注释掉:AfxGetMainWnd()那条语句.
      

  5.   

    在程序的APP类中将InitInstance()函数中的不要创建主窗口,在CSplashWnd类的OnTimer函数里面创建就行了
      

  6.   

    因为我是希望splash屏和主框架程序不同时出现,注释后就没什么意义了
      

  7.   


    放到什么地方?
    大家都没有仔细看我的问题,
    “我就跟踪了一下,发现,即便不加入splash,在CXXXAPP的InitInstance函数中,注释掉 
    m_pMainWnd->ShowWindow(SW_SHOW); 
               m_pMainWnd->UpdateWindow(); 
    依然可以正常出现应用程序窗口,估计这是问题所在。但是如何解决? ”
      

  8.   

    估计lz的是单文档应用程序
    要想启动不显示
    可以这么解决
    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);
      

  9.   


    怎么可能呢?我这就没问题。基本不需要加代码啊
    你可以把默认的加是CMainFrame里面的 CSplashWnd::ShowSplashScreen();  放在APP类里面的初始化函数里面,在框架生成事前,不过得改成 CSplashWnd::ShowSplashScreen(AfxGetMainWnd());  这样绝对没问题。我刚刚就试验了下。
      

  10.   


    感谢楼上对我的问题持续关注!
    我也刚刚做过试验,建立一个vcSDI程序后,唯一添加splash,按照楼上的方法,进行了修改。应用程序框架和splash屏依然同时出现,感兴趣的朋友可以测试一下。
      

  11.   

    没有这么复杂吧只要保证splash窗口和程序主窗口先后创建就可以了,就是说等splash窗口销毁之后,在创建主窗口,这样就不存在隐藏问题了 
    最简单的就是,在CSplashWnd类的OnTimer函数里面完成主窗口的创建,同时KillTimer