zoukankan      html  css  js  c++  java
  • 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的博客:


  • 相关阅读:
    MySQL常见问题(包括忘记root密码)
    MySQL运维面试基础题目
    系统根目录可用空间低于20%,清理mysql binary logs日志空间
    服务检测是否正常运行的shell脚本
    CentOS下安装 MySQL5.5
    问题处理--ceph集群告警: pgs inconsistent修复方案
    十、Spring中常用注解-分层整理
    七、SXSSFWorkbook生成大excle,避免内存溢出
    一、FreeMarker实现对js和css压缩
    九、web.xml理解
  • 原文地址:https://www.cnblogs.com/pang123hui/p/1948279.html
Copyright © 2011-2022 走看看