VS2008手动实现程序初始画面

       昨天晚上没事看了孙鑫VC视频的第9课,一边和老婆发短信,一边听着视频,感觉优哉游哉的,呵呵,无语的是最后他又用VC组件了,好吧,我承认我用的VS2008,而从VS2005开始就不支持Splash screen这样地基于源码地组件了,上一个右键菜单组件我就忍了,你还来……

      不过本着不服输的精神,就手动整一个吧,还有就是可能贴出来的代码排版有问题,事先声明不是我的错,这个CSDN博客系统的问题,有图为证,看看我那边test日志就知道了
      新建一个单文档应用程序,从CWnd类派生一个类就叫CSplashWnd吧,如图。

      添加两个保护属性的成员变量,如下所示,感觉有时用向导反而不爽,自己敲吧。
 
 
  1.       // 初始画面位图       CBitmap m_bitmap; 
  2.       //指向初始画面窗口的指针       static CSplashWnd* c_pSplashWnd;  

 

不祥写了,过程看代码吧,有注释。
 
 
  1. // CSplashWnd 消息处理程序 
  2.  //向CSplashWnd类中加入一个静态公有成员函数ShowSplashScreen
  3.   //该函数将被主框架窗口调用 void CSplashWnd::ShowSplashScreen(CWnd *pParentWnd) 
  4.          //此函数传递的参数是主框架窗口         
  5.          if(c_pSplashWnd != NULL) 
  6.          { 
  7.                  return
  8.          } 
  9.  
  10.          //创建初始画面窗口         
  11.           c_pSplashWnd = new CSplashWnd; 
  12.  
  13.          if(!c_pSplashWnd->Create(pParentWnd)) 
  14.          {                 
  15.                  delete c_pSplashWnd; 
  16.          } 
  17.          //显示初始画面窗口         
  18.          else         
  19.         { 
  20.                  c_pSplashWnd->UpdateWindow();                
  21.          } 
  22.  
  23. //编辑ShowSplashScreen函数中调用的Create函数(保护成员函数)
  24. BOOL CSplashWnd::Create(CWnd * pParentWnd) 
  25. {        
  26.         //载入位图        
  27.        if(!m_bitmap.LoadBitmap(IDB_BITMAP1)) 
  28.         { 
  29.                 return FALSE; 
  30.         } 
  31.                  
  32.         BITMAP bm; 
  33.         m_bitmap.GetBitmap(&bm); 
  34.          
  35.         //创建主框架窗口的子窗口        
  36.        return CreateEx(0,AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)), 
  37.                 NULL, WS_POPUP | WS_VISIBLE, 0, 0, bm.bmWidth, bm.bmHeight,  
  38.                 pParentWnd->GetSafeHwnd(), NULL); 
  39.          
  40.         return false
  41.  
  42. //CreateEx将调用OnCreate函数进行窗口的初始化,重载此函数
  43. int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  44.         if (CWnd::OnCreate(lpCreateStruct) == -1) 
  45.                 return -1; 
  46.  
  47.         // TODO:  在此添加您专用的创建代码        
  48.        CenterWindow(); 
  49.         //时间控制        
  50.        SetTimer(1, 1000, NULL);  
  51.  
  52.         return 0; 
  53.  
  54. //显示窗口时发送WM_PAINT消息响应void CSplashWnd::OnPaint() 
  55.         CPaintDC dc(this); 
  56.       // device context for painting        
  57.       // TODO: 在此处添加消息处理程序代码        
  58.        // 不为绘图消息调用 CWnd::OnPaint()        
  59.        CDC dcImage; 
  60.         if(!dcImage.CreateCompatibleDC(&dc))  
  61.         { 
  62.                 return
  63.         } 
  64.                  
  65.         BITMAP bm; 
  66.         m_bitmap.GetBitmap(&bm); 
  67.         CBitmap* pOldBitmap=dcImage.SelectObject(&m_bitmap); 
  68.         dc.BitBlt(0, 0, bm.bmWidth,bm.bmHeight, &dcImage, 0, 0, SRCCOPY); 
  69.  
  70.         dcImage.SelectObject(pOldBitmap); 
  71.  
  72. //在定时器到时销毁窗口void CSplashWnd::OnTimer(UINT_PTR nIDEvent) 
  73.         // TODO: 在此添加消息处理程序代码和/或调用默认值        
  74.         //销毁初始画面窗口        
  75.         DestroyWindow();  
  76.         //刷新主框架窗口        
  77.         AfxGetMainWnd()->UpdateWindow(); 
  78.          
  79.         //CWnd::OnTimer(nIDEvent);
  80.  
  81. //为防止内存溢出,窗口销毁后要释放CSplashWnd对象
  82. //重载虚拟函数PostNcDestroy,此函数在窗口销毁后调用,已达到此目的void CSplashWnd::PostNcDestroy() 
  83.         // TODO: 在此添加专用代码和/或调用基类                
  84.        delete this
  85.         //CWnd::PostNcDestroy();
  86.   

 

       还有不要忘了新建或导入一个ID号为IDB_BITMAP1的位图。
       这是我找的位图,还好,还好。

        当然大家会有这样一个经历,就是一般这种功能的软件都有一种功能,就是当图片显示的时候,往往用户是不想看到这个画面的,那么点击鼠标或敲击键盘,应该可以使这个画面立即跳过,而不再等到定时器到时再去关闭。
        在CWinApp重写转发处理函数PreTranslateMessage(),调用已在调度消息之前对消息进行筛选。
 
 
  1. BOOL ClessonApp::PreTranslateMessage(MSG* pMsg) 
  2.         // TODO: 在此添加专用代码和/或调用基类        
  3.        if (CSplashWnd::PreTranslateAppMessage(pMsg)) 
  4.         { 
  5.                 return TRUE; 
  6.         } 
  7.         return CWinApp::PreTranslateMessage(pMsg);      
  8. }  

  

不要忘了在头部添加CSplashWnd的头文件,Ok了,这样功能就算完善了。

---------------------------------------------------------------------------------- 

转载我博客文章郑重声明:技术性网站著名原创作者即可转载,商业性网站必须经过我的同意才能转载,否则追究责任——

pang123hui的博客:


原文地址:https://www.cnblogs.com/pang123hui/p/1948279.html