VC实现透明图的闪屏对话框动画

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
在一些项目中经常遇到,在初始化时需要耗费很长时间的情况,比如加载系统驱动等等。这种情况下就需要设计一个闪屏来混淆用户视觉,增加动画闪屏。参考了网上的不动闪屏,不多说上代码:
SplashWnd.h
#pragma once
#include "afxwin.h"

#define PI	3.14159265
class CSplashWnd:public CWnd
{
DECLARE_DYNAMIC(CSplashWnd)
private: 
    CDC mMemDC; 
    BITMAP bmBitmap; 
    CBitmap m_Bitmap; 
    CBitmap *Old_Bitmap; 

	HANDLE g_hThread;
public: 
	CImage image;
	long m_lHeight;
	long m_lWidth;
    void CreateSplash(); 
	void DeleteSplash(); 
    void ImageFrom_IDResource(UINT nID, LPCTSTR sTR, CImage *  pImg);
	void SetInfo(CString info);
public:
CSplashWnd();
virtual ~CSplashWnd();

protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
public:

	CString m_strInfo;
	afx_msg void OnNcDestroy();
	double m_dbOldSpeed;
};
SplashWnd.cpp
#include "stdafx.h"
#include "math.h"
#include "resource.h"
#include "SplashWnd.h"


// CSplashWnd

IMPLEMENT_DYNAMIC(CSplashWnd, CWnd)

bool ExitFlag;

DWORD WINAPI  On_Timer(LPVOID pParam);

CSplashWnd::CSplashWnd()
: m_strInfo(_T("Initializing..."))
, m_dbOldSpeed(-1)
{
	ImageFrom_IDResource(IDB_PNG57,"PNG",&image);
	//m_Bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP1)); //Load Bitmap 
	//m_Bitmap.GetBitmap(&bmBitmap);        //Get Bitmap Info 
	//m_lWidth=bmBitmap.bmWidth,  //Bitmap Width = Splash Window Width 
	//m_lHeight=bmBitmap.bmHeight, //Bitmap Height = Splash Window Height 
	m_lWidth=image.GetWidth();  
	m_lHeight=image.GetHeight();
}

CSplashWnd::~CSplashWnd()
{
	if(g_hThread!=NULL)
	{
		CloseHandle(g_hThread);
	}

}


BEGIN_MESSAGE_MAP(CSplashWnd, CWnd)
ON_WM_PAINT() 
ON_WM_NCDESTROY()
END_MESSAGE_MAP()



// CSplashWnd 消息处理程序

void CSplashWnd::DeleteSplash() 
{
	ExitFlag=true;
}
void CSplashWnd::CreateSplash() 
{ 
//Create Splash Window 
CWnd::CreateEx(0, 
  AfxRegisterWndClass( 
  0, 
  AfxGetApp()->LoadStandardCursor(IDC_UPARROW)), 
  NULL, 
  //            "SplashWindow Sample", 
  WS_POPUP, 
  0, 
  0, 
  m_lWidth,  //Bitmap Width = Splash Window Width 
  m_lHeight, //Bitmap Height = Splash Window Height 
  NULL, 
  NULL, 
  NULL); 

this->CenterWindow(); 
this->ShowWindow(SW_SHOW);
this->UpdateWindow(); 
ExitFlag=false;
g_hThread= CreateThread(0,NULL,On_Timer,(LPTHREAD_START_ROUTINE)this,0,NULL);
} 

void CSplashWnd::OnPaint() 
{ 

    CPaintDC dc(this); 

    //CBrush brush; 
    //brush.CreateSolidBrush(RGB(64,64,255)); 
    //dc.SelectObject(&brush); 
    //dc.Rectangle(0,0,bmBitmap.bmWidth,bmBitmap.bmHeight); 

    //mMemDC.CreateCompatibleDC(NULL); //Create Memory DC 
    //Old_Bitmap = mMemDC.SelectObject(&m_Bitmap); //Select DC 
    //int num = bmBitmap.bmWidth/40; 
    //dc.StretchBlt(0,0,bmBitmap.bmWidth,bmBitmap.bmHeight,&mMemDC,0,0,bmBitmap.bmWidth,bmBitmap.bmHeight,SRCCOPY); 
	//mMemDC.SelectObject(Old_Bitmap); //Select Bitmap 
	CRect rect; 
	rect.top =0;
	rect.left =0;
	rect.bottom=m_lHeight;   
	rect.right =m_lWidth; 
    image.Draw(dc.m_hDC, rect);//将图片绘制到picture表示的区域内  

	CFont font;
	font.CreateFont(28, 0, 0, 0, FW_NORMAL,FALSE, FALSE, FALSE, 0, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,   DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, "Times New Roman");
	dc.SetBkMode(TRANSPARENT);
	dc.SetTextColor(RGB(255,255,255));    //Static控件1的字体颜色-红色
	dc.SelectObject(&font); 
	CRect m_RectInfoShow(22,728,1000,760);//信息区域

    dc.DrawText(m_strInfo,m_RectInfoShow, DT_LEFT | DT_EDITCONTROL | DT_WORDBREAK);
    font.DeleteObject(); 

} 

void CSplashWnd::ImageFrom_IDResource(UINT nID, LPCTSTR sTR, CImage *  pImg) 
{
	HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(nID), _T(sTR));  
    if(hrsrc)  
    {  
      HGLOBAL hglb = LoadResource(NULL, hrsrc);  
      LPVOID lpsz = LockResource(hglb);  
      ULARGE_INTEGER srcSize;  
      srcSize.QuadPart = SizeofResource(NULL, hrsrc);  
        
      IStream * pStream = NULL;  
      CreateStreamOnHGlobal(NULL, TRUE, &pStream);   
      if(pStream)  
      {  
        pStream->SetSize(srcSize);  
        DWORD cbWritten = 0;  
        pStream->Write(lpsz, srcSize.LowPart, &cbWritten);  
          
		pImg->Load(pStream);  
        //VERIFY( m_BkImage.Load(pStream) == S_OK );  
        pStream->Release();  
      }  
    }  
}
void CSplashWnd::SetInfo(CString info)
{
	m_strInfo=info;
}
//void CSplashWnd::OnTimer(UINT_PTR nIDEvent)
DWORD WINAPI On_Timer(LPVOID pParam)
{
	CSplashWnd *pDlg = (CSplashWnd *)pParam;
	int iInfo;
	static int nDisplay=-1;
	while(!ExitFlag)
   {
		if(pDlg->m_strInfo.Find("Initializing")>-1) 
		{
			nDisplay=nDisplay>3?0:nDisplay+1;   
			switch(nDisplay)   
			{   
			case 0: pDlg->m_strInfo="Initializing"; break;   
			case 1: pDlg->m_strInfo="Initializing."; break;   
			case 2: pDlg->m_strInfo="Initializing.."; break;   
			case 3: pDlg->m_strInfo="Initializing..."; break;   
			}          
		}
		if((iInfo=pDlg->m_strInfo.Find('$'))>1)
			pDlg->m_strInfo=pDlg->m_strInfo.Mid(1,iInfo-1);
		CDC *pDc;
		pDc=pDlg->GetDC();
		CDC  * pMemDc=NULL; //加载背景图片的内存DC
		CRect rect; 
		rect.top =0;
		rect.left =0;
		rect.bottom= pDlg->m_lHeight;   
		rect.right = pDlg->m_lWidth; 

		pMemDc=new CDC;
		pMemDc->CreateCompatibleDC(pDc);
		CBitmap bmp;//这里的Bitmap是必须的,否则当心弄出一个大黑块哦。
		bmp.CreateCompatibleBitmap(pDc,rect.Width(),rect.Height());
		pMemDc->SelectObject(&bmp);

		
		pDlg->image.Draw(pMemDc->m_hDC, rect);//将图片绘制到picture表示的区域内  

		CFont font;
		//font.CreateFont(15, 0, 0, 0, FW_BOLD,FALSE, FALSE, FALSE, 0, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,   DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, L"Times New Roman");
		font.CreateFont(40, 0, 0, 0, FW_NORMAL,FALSE, FALSE, FALSE, 0, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,   DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, "Times New Roman");
		pMemDc->SetBkMode(TRANSPARENT);
		pMemDc->SetTextColor(RGB(255,255,255));    //Static控件1的字体颜色-红色
		pMemDc->SelectObject(&font); 

		CString str;
		CRect m_RectDateTimeShow(642,48,1000,86);//日期时间
		CTime time = CTime::GetCurrentTime();       
		str.Format("%04d-%02d-%02d %02d:%02d:%02d",time.GetYear(),time.GetMonth(),time.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond());  
		pMemDc->DrawText(str,m_RectDateTimeShow, DT_CENTER | DT_EDITCONTROL | DT_WORDBREAK);
		font.DeleteObject(); 

		font.CreateFont(28, 0, 0, 0, FW_NORMAL,FALSE, FALSE, FALSE, 0, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,   DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, "Times New Roman");
		pMemDc->SetBkMode(TRANSPARENT);
		pMemDc->SetTextColor(RGB(255,255,255));    //Static控件1的字体颜色-红色
		pMemDc->SelectObject(&font); 
		CRect m_RectInfoShow(22,728,1000,760);//信息区域
		pMemDc->DrawText( pDlg->m_strInfo,m_RectInfoShow, DT_LEFT | DT_EDITCONTROL | DT_WORDBREAK);
		font.DeleteObject(); 

		double SpeedVal=0.0;
		pDlg->m_dbOldSpeed=SpeedVal;
		CPen RectPen(PS_SOLID,5,RGB(255,0,0));
		pMemDc->SelectObject(&RectPen); 
		pMemDc->MoveTo(313,282);
		pMemDc->LineTo((int)(313+cos((360-(180-(0+SpeedVal*3.38/5*180/27)))*PI/180)*200),(int)(282+sin((360-(180-(0+SpeedVal*3.38/5*180/27)))*PI/180)*200));
		RectPen.DeleteObject();
		pDc->BitBlt(0,0,pDlg->m_lWidth,pDlg->m_lHeight,pMemDc,0,0,SRCCOPY);
		bmp.DeleteObject();
		pMemDc->DeleteDC();
		pDc->DeleteDC();

		Sleep(500);
	}
	//CWnd::OnTimer(nIDEvent);
	return true;
}

void CSplashWnd::OnNcDestroy()
{
	CWnd::OnNcDestroy();

	::PostQuitMessage(0);//为了使线程自动退出. 
}
使用这个类,需要在项目中添加PNG图片资源,使用时注意添加资源
IDB_PNG57
在项目上右键添加现有项目添加这两个文件.
在比较耗时的窗体头文件中添加 
CSplashWnd *m_pSplashWindow;
在其CPP文件中 OnCreate 添加
    m_pSplashWindow= new CSplashWnd();
    m_pSplashWindow->CreateSplash(); 
在其CPP文件中 OnPaint 添加
m_pSplashWindow->DeleteSplash();





vc动画图形的制作 vc图形绘制的一个实例,帮助初学者们更好的理解vc的原理,操作简单 立即下载

相关推荐

MFC GDI+ 用png图片做的异形窗口,渐显渐隐启动退出

MFC GDI+ 用png图片做的异形窗口,渐显渐隐启动退出,可以用来做启动画面。

VC++实现“动态”的位图动画

摘要:VC/C++源码,界面编程,位图动画 VC++实现“动态”的位图动画,这个比静态的BMP动画更流畅了些,具体怎么实现了,您看了源码就知道了。相关释义:   CBitmap m_Bitmap[6]; //装载要显示位图对象   int m_nFrameWidth; //图象宽度   int m_nFrameHeight; //图象高度   CPoint m_ptCurPos; //当前的滚动位置   int m_nCurFrameNo; //当前显示的图象编号   int m_nStepX; //水平方向上的步进量    int m_nStepY; //垂直方向上的步进

VC++图像特效显示

本节主要介绍如何实现图像的浮雕、雕刻、百页窗、旋转、扫描、栅条、马赛克、和渐显渐隐显示等效果。 实现图像的特殊效果的显示的基本思路是要么是操作图像的像素,要么是对图像分块按一定的方向或次序,分阶段的显示或擦除对应的图像块。 对于第二种显示的思路,其中的要点是:1.划分图像块;2.确定图像块的操作次序;3.显示或清除对应的图像块;4.在两个连续显示的图像块之间插入一个固定的延迟。其中图像块的划分决定了图像的显示方式,图像块的显示顺序决定了显示的方向和细分的依据。不同的效果决定了不同的分块方法和显示次序,我们将在后面的各种特效显示中介绍如何分块和决定次序。为了使图像的显示过程明显的表现出来,实现显示的特效,就需要在图像块的依此显示中插入固定的延迟。

【181204】VC++ 分解GIF动画图片并显示播放源代码

源码下载简介 VC++ 分解GIF动画图片并显示播放,通过二进制进行分解GIF动画的每一帧,并显示出来。 源码下载地址:点击下载 备用下载地址:点击下载 ...

资源小站 576

VC程序中加载GIF动画

<br />PictureEx图片显示类支持以下格式的图片:GIF (including animated GIF87a and GIF89a), JPEG, BMP, WMF, ICO, CUR等,我特别推崇的是可以做出动画,而且轻而易举,确实很COOL。 <br />下面是详细的编程过程:<br />1. 新建项目:在VC6中用MFC新建一个基于对话框的GifDemo应用程序,接受所有缺省选项即可;<br />2.在项目中插入文件:把PictureEx.h,PictureEx.cpp文件copy 到项目

scollins的专栏 703

VC显示GIF图片

如果是使用VB,也许这个话题是多余的,因为VB有一个图象控件可以非常容易地实现各种格式的图象显示功能,然而对于VC却没有一个象样的控件可以达到这种效果,怎么办?经过一段日子的研究,发现只需要实现两步工作,就可以在VC实现如同VB中一样的gif动态效果。本文将介绍的两部分是IPicture接口的使用和gif的储存格式,好象一听到储存格式,读者就不想再看下去了!其实不然,这里

cacasi886的专栏 658

VC 显示GIF动画的两种方法

<br />1 使用 GDI+ ,代码如下<br /> <br />Image *pImg=Image::FromFile(L"e://pkgame//bin//face//爱死你们了.gif");<br />UINT count=pImg->GetFrameDimensionsCount();<br />GUID *pGuid=(GUID*)new GUID[count];<br />pImg->GetFrameDimensionsList(&pGuid[0],count);<br />WCHAR str

justin_bkdrong的专栏 8709

自定义Dialog及使用动画效果

项目结构 1、基类BaseDialog public abstract class BaseDialog extends Dialog{ public BaseDialog dialog; public Activity activity; public BaseDialog(@NonNull Activity activity) { sup...

七水情 6113

对话框弹出动画

对话框弹出动画,有好多种

对话框动画

对话框从底部滑出,铺满全屏

各种对话框动画

各种各样儿的对话框,懒人必备

仿微信对话框效果,弹出带动画效果

仿微信对话框效果,弹出带动画效果,详细讲解请参考:http://blog.csdn.net/jakeyangchina/article/details/53423453

如何设置对话框动画效果

我们这里主要用到User32.dll中的AnimateWindow函数来实现对话框动画效果,在对话框的初始化代码中加上如下代码: BOOL CLOGIN::OnInitDialog() { CDialog::OnInitDialog(); m_TypeList.SetCurSel(1); CenterWindow(); DWORD dwStyle = AW_CENT...

yingyingol 285

使用CImage类在Pictrue控件上画图片

(1)从文件中加载图片voidCScale3DCUserManageView::OnDraw(CDC*pDC) { //TODO:在此添加专用代码和/或调用基类 CImageimage;//创建图片类 USES_CONVERSION; INTre=_access(W2A(m_strUserPicPath),0);//判文件是否存在 if(r...

weixin_33887443的博客 356

MFC清除已画好的图片

CPaintDC dc(this);image.Destroy();image.Load(picstr);dc.SetStretchBltMode(HALFTONE);if (image) image.Draw(dc.m_hDC, rect); 把上述代码写到onpaint里面,在合适的地方给定rect和picstr的值,调用invalidate函数就能发送wm_paint消息,执行onpain

A18149287626的博客 6920

VC++编程中为程序加入启动画面功能

如何为自己的程序加入启动画面   观察我们平常使用的软件,当我们双击软件的时候,会在主界面出现前,先行出现一个启动画面,由于前一阵子写了一个基于对话框的程序,亲自实验了下,今天就为大家简单的介绍下,在我们的程序中如何实现增加启动画面的功能。    在这里说明说明一下,我们平常使用的编译器是VS2010 或者是VS2012,在早一点的版本中,例如vc6.0中,加入启动画面这一功能,编译器已经为我

追尋ゝ 4369

自定义dialog和弹出dialog的动画

自定义dialog final Dialog dialog = new Dialog(ChartVisit.this); LayoutInflater inflater=getLayoutInflater(); final View dialogview=inflater.inflate(R.layout.layout_fragmen

bianshaopeng的博客 1万+

2026年最新温岭市公交线路矢量数据.zip

数据格式:shp 数据坐标:GCJ02 数据更新时间:2026年9月 公交线路来源:8684网站 https://8684.com.cn/ 站点数据来源:高德API接口 数据打开方式:QGIS或Arcgis 站点数据字段:名称、序号、对应线路、几何信息 线路数据字段:名称、类型、起点、终点、开始时间、结束时间、起步价、全价、长度、公司、几何信息

上一篇: 为 SQL 2005 SQLEXPRESS 添加sa 帐户
下一篇: 最简单的 GitExtensions 教程(持续更新中)
xinxing124
博客等级 码龄20年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值