首页 > 代码库 > MFC添加启动画面与CImage结合版

MFC添加启动画面与CImage结合版

最近做一个启动画面,发现Splash只能加载bitmap,发现bitmap图片效果不太好,所以找了下在C++中有什么可以加载PNG或者JPG等类型的图片,在网上找半天后,发现CImage这个类相当好用,而且还可以和CBitmap相互转换,这样我只要修改一小段代码,就可以实现用位图以外的图片来做启动画面了,在找图片的时候也不这么麻烦,因为CImage基本支持多种图片格式,很好用。详细可以自行百度哦。下面附上代码。

1.在工程中添加C++类,CWzdSplash。基类是CWnd

添加代码:

#ifndef _SPLASH_SCRN_#define _SPLASH_SCRN_#pragma once  // CWzdSplash  class CWzdSplash : public CWnd{    DECLARE_DYNAMIC(CWzdSplash)public:    CWzdSplash();    virtual ~CWzdSplash();protected:    DECLARE_MESSAGE_MAP()public:    CBitmap m_bitmap;    //  void Create(void);      void Create(HBITMAP hbitmap);    afx_msg void OnPaint();    };#endif

 

CPP

// WzdSplash.cpp : 实现文件  //  #include "stdafx.h"  #include "test1.h"#include "CwzdSplash.h"  // CWzdSplash  IMPLEMENT_DYNAMIC(CWzdSplash, CWnd)CWzdSplash::CWzdSplash(){}CWzdSplash::~CWzdSplash(){}BEGIN_MESSAGE_MAP(CWzdSplash, CWnd)    ON_WM_PAINT()END_MESSAGE_MAP()// CWzdSplash 消息处理程序  void CWzdSplash::Create(HBITMAP hbitmap){    //m_bitmap.LoadBitmap(nBitmapID);    BITMAP bitmap;    m_bitmap.Attach(hbitmap);    m_bitmap.GetBitmap(&bitmap);    //CreateEx(0,AfxRegisterWndClass(0),"",WS_POPUP|WS_VISIBLE|WS_BORDER,0,0,bitmap.bmWidth,bitmap.bmHeight,NULL,0);      CreateEx(0,        AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),        NULL, WS_POPUP | WS_VISIBLE, 0, 0, bitmap.bmWidth, bitmap.bmHeight, NULL, NULL);        CWnd::CenterWindow();    CWnd::UpdateWindow();}void CWzdSplash::OnPaint(){    // TODO: 在此处添加消息处理程序代码      // 不为绘图消息调用 CWnd::OnPaint()      CPaintDC dc(this); // device context forpainting      BITMAP bitmap;    m_bitmap.GetBitmap(&bitmap);    CDC dcComp;    dcComp.CreateCompatibleDC(&dc);    dcComp.SelectObject(&m_bitmap);    // draw bitmap      dc.BitBlt(0, 0, bitmap.bmWidth, bitmap.bmHeight, &dcComp, 0, 0, SRCCOPY);}

接下来,在OnCreat()函数中添加:

CImage image;    image.Load(_T("res/222.jpg"));    HBITMAP hbitmap = image.Detach();  //image转换成bitmap    CWzdSplash wndSplash;                 //创建启动窗口类的实例      wndSplash.Create(hbitmap);    Sleep(1500);    wndSplash.DestroyWindow();//销毁初始画面窗口 

这个就大功告成了。

这类splash我减去了OnTime()函数,因为我发现多了也用不上,毕竟是我收到添加的代码,

并且为了让画面出来的效果好些,用了Sleep()函数让对话框睡眠,所以OnTime()就基本用不上了,

以上是本人瞎玩,有错误或者说漏的地方,还请大家多多包涵。