1.  新建一个MFC项目SDI或MDI。

2.  新建或导入一个ID为IDB_SPLASH的位图。

3.  添加现有项SplashWnd.h和SplashWnd.cpp。

SplashWnd.h源代码


#ifndef _SPLASH_HEADER_
#define _SPLASH_HEADER_

#pragma once
//#include "afxwin.h"

// CSplashWnd

class CSplashWnd : public CWnd
{
//DECLARE_DYNAMIC(CSplashWnd)

public:
CSplashWnd();
virtual ~CSplashWnd();
virtual void PostNcDestroy();

public:
CBitmap m_bitmap;

protected:
static BOOL c_bShowSplashWnd;
static CSplashWnd* c_pSplashWnd;

public:
static void EnableSplashScreen(BOOL bEnable = TRUE);
static void ShowSplashScreen(CWnd* pParentWnd = NULL);
static BOOL PreTranslateAppMessage(MSG* pMsg);

protected:
BOOL Create(CWnd* pParentWnd = NULL);
void HideSplashScreen();

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnPaint();
afx_msg void OnTimer(UINT nIDEvent);

protected:
DECLARE_MESSAGE_MAP()
};

#endif

SplashWnd.cpp源代码

// SplashWnd.cpp : 实现文件
//

#include "stdafx.h"
#include "resource.h"
#include "SplashWnd.h"

// CSplashWnd

//IMPLEMENT_DYNAMIC(CSplashWnd, CWnd)

BOOL CSplashWnd::c_bShowSplashWnd = FALSE;
CSplashWnd* CSplashWnd::c_pSplashWnd;

CSplashWnd::CSplashWnd()
{

}

CSplashWnd::~CSplashWnd()
{
// Clear the static window pointer.
ASSERT(c_pSplashWnd == this);
c_pSplashWnd = NULL;
}

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

void CSplashWnd::EnableSplashScreen(BOOL bEnable /*= TRUE*/)
{
c_bShowSplashWnd = bEnable;
}

void CSplashWnd::ShowSplashScreen(CWnd* pParentWnd /*= NULL*/)
{
if (!c_bShowSplashWnd || c_pSplashWnd != NULL)
return;
// Allocate a new splash screen, and create the window.
c_pSplashWnd = new CSplashWnd;
if (!c_pSplashWnd->Create(pParentWnd))
delete c_pSplashWnd;
else
c_pSplashWnd->UpdateWindow();
}

BOOL CSplashWnd::PreTranslateAppMessage(MSG* pMsg)
{
if (c_pSplashWnd == NULL)
return FALSE;

// If we get a keyboard or mouse message, hide the splash screen.
if (pMsg->message == WM_KEYDOWN ||
pMsg->message == WM_SYSKEYDOWN ||
pMsg->message == WM_LBUTTONDOWN ||
pMsg->message == WM_RBUTTONDOWN ||
pMsg->message == WM_MBUTTONDOWN ||
pMsg->message == WM_NCLBUTTONDOWN ||
pMsg->message == WM_NCRBUTTONDOWN ||
pMsg->message == WM_NCMBUTTONDOWN)
{
c_pSplashWnd->HideSplashScreen();
return TRUE; // message handled here
}

return FALSE; // message not handled
}

BOOL CSplashWnd::Create(CWnd* pParentWnd /*= NULL*/)
{
if (!m_bitmap.LoadBitmap(IDB_SPLASH))
return FALSE;

BITMAP bm;
m_bitmap.GetBitmap(&bm);

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

void CSplashWnd::HideSplashScreen()
{
// Destroy the window, and update the mainframe.
DestroyWindow();
AfxGetMainWnd()->UpdateWindow();
}

void CSplashWnd::PostNcDestroy()
{
// Free the C++ class.
delete this;
}

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

// Center the window.
CenterWindow();

// Set a timer to destroy the splash screen.
SetTimer(1, 1000, NULL);

return 0;
}

void CSplashWnd::OnPaint()
{
CPaintDC dc(this);

CDC dcImage;
if (!dcImage.CreateCompatibleDC(&dc))
return;

BITMAP bm;
m_bitmap.GetBitmap(&bm);

// Paint the image.
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 nIDEvent)
{
// Destroy the splash screen window.
HideSplashScreen();
}

4.  在App主程序实现代码中把上面的头文件包含进去,并在InitInstance函数中添加下面一段代码。

{
  CCommandLineInfo cmdInfo;
  ParseCommandLine(cmdInfo);
  CSplashWnd::EnableSplashScreen(cmdInfo.m_bShowSplash);
}

5.  最后,在主框架窗口实现代码中包含Splash头文件,在OnCreate函数return前调用CSplashWnd类的ShowSplashScreen函数即可。

//显示Splash窗口
CSplashWnd::ShowSplashScreen(this);

转载于:https://www.cnblogs.com/flyandon/archive/2010/09/21/1832475.html

MFC中添加Splash Screen相关推荐

  1. MFC中添加自己定义的消息

    由于自己要做一个拼音输入模块,比如我按下a键后,让它产生一个消息,在消息处理函数里去搜寻a所对应的汉字.由于系统似乎没有提供相应的消息,所以我自己定义了一个! 具体做法如下: 集成开发环境vs2005 ...

  2. 实现在Android开发中的Splash Screen开场屏的效果

    很多网友可能发现近期Tencent推出的手机QQ Android版包含了一个开场屏Splash Screen载入效果,通常游戏或大型软件打开时可能需要一个释放解析资源的过程,需要一个前台的动画播放和后 ...

  3. 在MFC中添加用户自定义消息

    消息机制是windows的典型运行机制,在MFC中有很多的消息如WM_BTN**等.但是在有些情况下我们需要自定义一些消息去做一些我们需要的功能,MFC的向导不能帮助我们做到这一点,我们可以通过添加相 ...

  4. MFC中添加GIF图片

    from:http://www.tuicool.com/articles/uAFVBb2 项目中想实现这样的功能:下拉选择框选择一个天气条件后,就在界面上显示对应天气条件的GIF动态图.通过搜索,找到 ...

  5. MFC中添加一张图片作为对话框(或CFormView)的背景

    步骤: 1.从VC6.0的Resources中添加一张bmp图片 如图: 右击Dialog,选择import,就可以导入一张图片到资源文件中,会默认生成一个Bitmap文件夹,资源ID号为IDB_BI ...

  6. (VC2005)MFC中添加控件的成员变量.

    VC 2005 中添加控件的成员变量. 方法一:使用变量添加向导. 右击控件->Add Variable (打开了 Add Member Variable Wizard)  -> 输入Va ...

  7. MFC中添加的ID资源号提示找不到声名问题

    1.查看resource.h资源文件,基本上都是因为某些界面上的修改等原因造成了里面部分定义ID号值重复了才报的错,所以要在resource.h文件中手动修改成不一样的id值.

  8. mfc中添加checkbox check、uncheck事件

    得到复选框状态的函数:CButton* pBtn = (CButton*)GetDlgItem(IDC_CHECK); int state = pBtnNONE->GetCheck(); 当st ...

  9. android oreo 开机动画,Android O添加了一个 Splash Screen API帮助简化启动屏制作

    大多数开发者对闪屏(splash screen)都持不同的态度.一些人支持用闪屏隐藏app的加载,然后自然过渡到主界面,而另一些人认为闪屏不管是对用户还是开发者都是浪费时间.谷歌在这个问题上的立场也是 ...

最新文章

  1. 弹性板计算和板带划分计算_计算双面太阳能板背面太阳辐射的新方法
  2. java.math.BigDecimal保留两位小数,保留小数,精确位数
  3. python api是什么_python – 如何处理API响应
  4. 前端学习(974):视频插件zy.media.js的使用
  5. CSP-J NOIP NOI数学与动态规划
  6. iOS7应用开发6:UINavigation, UITabbar控制器的多态性
  7. [转载]设计模式解密(23) - 总结篇
  8. 2016年度最受欢迎中国开源软件评选
  9. 中国男足孔已己版(转载,博大家一笑)
  10. python程序员专用壁纸_程序员如何一键“Get”高清壁纸?
  11. [AngularJS面面观] 16. 依赖注入 --- 注入器中如何管理对象
  12. OpenKG数据逐一截图说明
  13. linux 查看定时任务
  14. redis的二进制安全机制理解
  15. 利用pytorch实现平均绝对值误差(MAE)
  16. Java基于Redis实现“附近的人”(含源码下载)
  17. Windows 7国家语言支持
  18. WHQL徽标认证申请流程
  19. CAD/CASS土地报备坐标数据提取插件txt报盘数据导出工具支持环岛地块
  20. django项目支持外网访问--花生壳

热门文章

  1. Alibaba数学竞赛试题与答案汇总(持续更新中)
  2. QuorumPeerMain数量可否和HRegionServer节点数量不一致?
  3. 启动hbase后hregionserver没有启动
  4. AttributeError: 'Model' object has no attribute 'target_tensors'
  5. 6.1 范数最小解,右逆,零空间映射矩阵
  6. 1.12 四类向量组
  7. 【机器学习】线性回归之梯度下降、多元线性回归概述
  8. winowsformshost 的构造函数执行符合指定的绑定约束的_C# 应该允许为 struct 定义无参构造函数...
  9. http协议实现web服务器,http协议实现web服务器
  10. cytoscape使用方法_7种方法 ,订制你的专属venn图!-代谢组学/蛋白组学研究