请选择 进入手机版 | 继续访问电脑版
查看: 9871|回复: 2206

[C/C++] VS2012_MFC创建启动动画

[复制链接]
  • TA的每日心情
    擦汗
    2019-10-17 06:41
  • 签到天数: 182 天

    [LV.7]常住居民III

    发表于 2016-3-13 21:37:51 | 显示全部楼层 |阅读模式
    本帖最后由 小圈圈 于 2016-3-13 22:25 编辑

    本文是读者在学习孙鑫的《VC++深入详解》时,对一些在VS2012与VC6.0不同地方,需要修改的代码进行整理得到的。在VC6.0时代,我们通过在MFC工程中插入Splash组件来简单方便的实现这个功能,但在VS2012没有这个功能,所以如果想给自己的程序添加一个显示Logo的启动画面,就需要自己添加代码来实现,参考了下VC6.0中这个Splash组件添加后的代码,就很容易在自己的项目里实现这个功能。
    首先,在菜单的“项目”中选择“类向导”,“添加类”,生成一个启动画面的Splash类。

    然后,实现代码主要是在CSplashWnd类的头文件和源文件中实现。在CSplashWnd类的头文件中我们添加下面的代码:
    #pragma once
    #include "afxwin.h"


    class CSplashWnd :
    publicCWnd
    {
    public:
    CSplashWnd(void);
    ~CSplashWnd(void);
    CBitmapm_bitmap;
    static voidShowSplashScreen(CWnd* pParentWnd = NULL);
    protected:
    BOOL Create(CWnd* pParentWnd= NULL);
    static CSplashWnd*c_pSplashWnd;
    public:
    DECLARE_MESSAGE_MAP()
    afx_msg intOnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg voidOnPaint();
    afx_msg voidOnTimer(UINT_PTR nIDEvent);
    };



    在CSplashWnd类的源文件中我们添加下面的代码:
    #include "stdafx.h"
    #include "SplashWnd.h"
    #include "resource.h"


    CSplashWnd*CSplashWnd::c_pSplashWnd;


    BEGIN_MESSAGE_MAP(CSplashWnd,CWnd)
    ON_WM_CREATE()
    ON_WM_PAINT()
    ON_WM_TIMER()
    END_MESSAGE_MAP()


    CSplashWnd::CSplashWnd(void)
    {
    }


    CSplashWnd::~CSplashWnd(void)
    {
    }


    void CSplashWnd::ShowSplashScreen(CWnd*pParentWnd)
    {
    c_pSplashWnd = newCSplashWnd;
    if(!c_pSplashWnd->Create(pParentWnd))
      deletec_pSplashWnd;
    else
    c_pSplashWnd->UpdateWindow();
    }


    BOOL CSplashWnd::Create(CWnd*pParentWnd)
    {
    if(!m_bitmap.LoadBitmap(IDB_BITMAP1))
      returnFALSE;


    BITMAPbm;
    m_bitmap.GetBitmap(&bm);


    returnCreateEx(0,
      AfxRegisterWndClass(0,AfxGetApp()->LoadStandardCursor(IDC_ARROW)),
      NULL, WS_POPUP |WS_VISIBLE, 0, 0, bm.bmWidth, bm.bmHeight,pParentWnd->GetSafeHwnd(), NULL);
    return0;
    }


    int CSplashWnd::OnCreate(LPCREATESTRUCTlpCreateStruct)
    {
    if(CWnd::OnCreate(lpCreateStruct) == -1)
      return-1;


    // TODO: 在此添加您专用的创建代码
    // Center thewindow.
    CenterWindow();


    // Set a timer to destroythe splash screen.
    SetTimer(1, 3000, NULL);   


    return0;
    }


    void CSplashWnd::OnPaint()
    {
    CPaintDC dc(this); // devicecontext for painting
    // TODO:在此处添加消息处理程序代码
    // 不为绘图消息调用CWnd::OnPaint()
    CDCdcImage;
    if(!dcImage.CreateCompatibleDC(&dc))
      return;


    BITMAPbm;
    m_bitmap.GetBitmap(&bm);


    // Paint theimage.
    CBitmap* pOldBitmap =dcImage.SelectObject(&m_bitmap);
    dc.BitBlt(0, 0, bm.bmWidth,bm.bmHeight, &dcImage, 0, 0, SRCCOPY);
    dcImage.SelectObject(pOldBitmap);
    }


    void CSplashWnd::OnTimer(UINT_PTRnIDEvent)
    {
    // TODO:在此添加消息处理程序代码和/或调用默认值
    DestroyWindow();
    AfxGetMainWnd()->UpdateWindow();


    CWnd::OnTimer(nIDEvent);
    }

    使用方法:
    再app和mainFram对应的cpp文件中包含头文件SplashWnd.h,需在MFC工程中的CMainFrame类中添加消息PreCreateWindow,并在函数定义中添加语句CSplashWnd::ShowSplashScreen(this);同时把位图资源添加进去,并设置好logo消隐时间即可。
    效果如图







    评分

    参与人数 1i币 +1 收起 理由
    iCole + 1 支持原创

    查看全部评分

    回复

    使用道具 举报

    该用户从未签到

    发表于 2016-3-14 05:54:49 | 显示全部楼层
    支持,看起来还是可以的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-3-14 13:30:28 | 显示全部楼层
    谢谢楼主的分享
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-3-15 01:48:26 | 显示全部楼层
    谢谢楼主的分享
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-3-15 08:38:37 | 显示全部楼层
    谢谢楼主的分享
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-3-15 12:49:46 | 显示全部楼层
    支持,看起来还是可以的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-3-15 13:46:44 | 显示全部楼层
    我是来水经验的……
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-10 03:16
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-3-15 19:51:09 | 显示全部楼层
    非常感谢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-10 03:16
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-3-15 20:35:17 | 显示全部楼层
    非常感谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-3-15 22:08:14 | 显示全部楼层
    支持中国红客联盟(ihonker.org)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表