VS2010 MFC项目添加启动画面

news/2024/10/31 5:36:00/

COPY FROM:http://blog.csdn.net/libenqing/article/details/5961991

在VC6.0时代,我们通过在MFC工程中插入Splash组件来简单方便的实现这个功能,但在VS2008以后就没有了这个功能,所以如果想给自己的程序添加一个显示Logo的启动画面,就需要自己添加代码来实现,参考了下VC6.0中这个Splash组件添加后的代码,就很容易在自己的项目里实现这个功能。如下图。

 

首先,在菜单的“项目”中选择“类向导”,生成一个启动画面的Splash类。


 

然后,实现代码主要是在CwzdSplash类的头文件和cpp文件中实现。在CwzdSplash类的头文件中我们添加下面的代码:

 

[cpp] view plain copy print ?
  1. #pragma once   
  2. // CWzdSplash   
  3. class CWzdSplash : public CWnd  
  4. {  
  5.     DECLARE_DYNAMIC(CWzdSplash)  
  6. public:  
  7.     CWzdSplash();  
  8.     virtual ~CWzdSplash();  
  9. protected:  
  10.     DECLARE_MESSAGE_MAP()  
  11. public:  
  12.     CBitmap m_bitmap;  
  13. //  void Create(void);   
  14.     void Create(UINT nBitmapID);  
  15.     afx_msg void OnPaint();  
  16.     afx_msg void OnTimer(UINT_PTR nIDEvent);  
  17. };  
 


在CwzdSplash类的cpp文件中我们添加下面的代码:


[cpp] view plain copy print ?
  1. // WzdSplash.cpp : 实现文件   
  2. //   
  3. #include "stdafx.h"   
  4. #include "TinyPlusCompiler.h"   
  5. #include "WzdSplash.h"   
  6. // CWzdSplash   
  7. IMPLEMENT_DYNAMIC(CWzdSplash, CWnd)  
  8.     CWzdSplash::CWzdSplash()  
  9. {  
  10. }  
  11. CWzdSplash::~CWzdSplash()  
  12. {  
  13. }  
  14. BEGIN_MESSAGE_MAP(CWzdSplash, CWnd)  
  15.     ON_WM_PAINT()  
  16.     ON_WM_TIMER()  
  17. END_MESSAGE_MAP()  
  18. // CWzdSplash 消息处理程序   
  19. void CWzdSplash::Create(UINT nBitmapID)  
  20. {  
  21.     m_bitmap.LoadBitmap(nBitmapID);  
  22.     BITMAP bitmap;  
  23.     m_bitmap.GetBitmap(&bitmap);  
  24.     //CreateEx(0,AfxRegisterWndClass(0),"",WS_POPUP|WS_VISIBLE|WS_BORDER,0,0,bitmap.bmWidth,bitmap.bmHeight,NULL,0);   
  25.     CreateEx(0,  
  26.             AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),  
  27.             NULL, WS_POPUP | WS_VISIBLE, 0, 0, bitmap.bmWidth, bitmap.bmHeight, NULL , NULL);  
  28. }  
  29. void CWzdSplash::OnPaint()  
  30. {  
  31.     // TODO: 在此处添加消息处理程序代码   
  32.     // 不为绘图消息调用 CWnd::OnPaint()   
  33.     CPaintDC dc(this); // device context forpainting   
  34.     BITMAP bitmap;  
  35.     m_bitmap.GetBitmap(&bitmap);  
  36.     CDC dcComp;  
  37.     dcComp.CreateCompatibleDC(&dc);  
  38.     dcComp.SelectObject(&m_bitmap);  
  39.     // draw bitmap   
  40.     dc.BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&dcComp,0,0,SRCCOPY);  
  41. }  
  42. void CWzdSplash::OnTimer(UINT_PTR nIDEvent)  
  43. {  
  44.     // TODO: 在此添加消息处理程序代码和/或调用默认值   
  45.     //CWnd::OnTimer(nIDEvent);   
  46.     DestroyWindow(); //销毁初始画面窗口   
  47. }  


最后在项目的主窗口视图的Create函数中添加下面的实例化过程就可以显示出我们自定义的Logo启动画面了:

 

[c-sharp] view plain copy print ?
  1. ///显示Splash,2010-10-15///   
  2.        CWzdSplash wndSplash;                 //创建启动窗口类的实例   
  3. wndSplash.Create(IDB_SPLASH);  
  4. wndSplash.CenterWindow();  
  5. wndSplash.UpdateWindow();          //send WM_PAINT   
  6. Sleep(1500);  
  7. wndSplash.DestroyWindow();//销毁初始画面窗口  



注明一下要注意的地方:wndSplash.Create(IDB_SPLASH);中的IDB_SPLASH是在添加位图资源时添加进来的资源ID,自己可以定义自己所喜欢的启动图画。


如果不使用Sleep()函数让线程休眠几秒,我们很难看到这个启动画面,但这样存在一个问题,让线程休眠不是一个好的办法,感觉应该用定时器去实现这功能的,但不是很熟悉定时器的使用,研究一下再把它改过来。



http://www.ppmy.cn/news/416513.html

相关文章

如何正确的关闭 MFC 线程

前言: 近日在网上看到很多人问及如何关闭一下线程,但是我看网上给出的并不详细,而且有些方法还是错误的。小弟在此拙作一篇,不谈别的,只谈及如何正确的关闭MFC的线程,至于Win32和C RunTime的线程暂不涉及。…

MFC消息映射机制详解

Windows程序和MFC程序是靠消息驱动的,他们对于消息的处理本质上是相同的。只是Windows程序对于消息处理的过程十分清晰明了,MFC程序则掩盖了消息处理的过程,以消息映射的方式呈现在开发者面前,使得开发消息的处理十分简单。用多了…

MFC程序的来龙去脉

引言 :   侯捷老师在他那本著名的"深入浅出MFC"(第二版)的第六章中对比着传统的Win32API编程,详细讲解了MFC应用程序“生死因果”,而且侯捷 老师还在"深入浅出MFC"(第二版&#xff…

MFC + Opencv 下面调用HoughCircles 报错

在用MFC配合opencv 开发界面时,调用HoughCircles 函数会报错 0x76ECE43E (ntdll.dll) (AFTESTTOOL.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0x5352DBCA 时发生访问冲突。 网上找了一个下午没找到类似的问题的解决方法,就只能自己去重写Op…

QT 与 MFC 的区别

MFC(微软基础类库)是专门为windows设计的一个用于开发图形用户界面的类库。MFC或多或少使用了面向对象的方法包装了Win32的API,正因如此,这些API有时是C,有时是C,甚至是C和C++的混合…

MFC与QT区别?

引用来源 http://wenda.chinabaike.com/b/30934/2013/1208/707410.html “前言” 写得还不错,但打上了些许个人色彩,个人认为这很正常的,希望大家多喷多讨论 QT使用的编译器是MinGW,即Linux下的GCC移植到windows的版本&#x…

QT和MFC

出处:http://blog.csdn.net/wangjinwj2008/article/details/7706599 我在使用MFC之前就已经使用Qt这个事实可能影响了我的客观性。 (MFC效率较高,但大量的Windows API和消息机制使得其较难理解,不易用;QT封装较好&…

Python if else条件语句详解

在 Python 中,可以使用 if else 语句对条件进行判断,然后根据不同的结果执行不同的代码,这称为选择结构或者分支结构。 Python 中的 if else 语句可以细分为三种形式,分别是 if 语句、if else 语句和 if elif else 语句&#xff…