欢迎界面进度条显示

程序设计中,为了使我们的软件更加人性化,需要一个欢迎界面,显示一个几秒钟的动画。
我们知道图片分层的概念,我们也知道png图片具有透明效果,那么进度条的动画显示效果可以这样来制作:

1.首先贴图,贴上背景图片和进度条图片



2.然后设置进度条动画显示

 


3.将背景图片进度条区域扣去,使其能显示下一层的内容

 


4.将进度条放置在背景图片下一层显示

 

这样我们就能看到一个简单带有进度条的欢迎界面了


1.新建对话框应用程序

2.添加GDI,具体使用方法见GdiPlus使用方法

3.贴图并实现动画

.h文件
private:
	int m_nStep;

	Image *m_pImageBackground;
	int m_nBackgroundWidth, m_nBackgroundHeight;

	Image *m_pImageProgress;
	int m_nProgressWidth, m_nProgressHeight;

private:
	void MyInitDialog();
	void InitUi();//设置界面初始化信息
	void GetImageSource();//获取图片信息

	void MyPaint();
	void DrawBackground(HDC hDC);//绘制背景
	void DrawProgress(HDC hDC);//绘制图片

	//获取图片信息
	BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, Image *&pImg);
	BOOL ImageFromIDResource(CString sFilePathName, Image *&pImg);
public:
	afx_msg void OnTimer(UINT_PTR nIDEvent);

.cpp文件
void CAppWelcomeProgressDlg::MyInitDialog()
{
	m_pImageBackground = NULL;
	m_nBackgroundWidth = 0;
	m_nBackgroundHeight = 0;

	m_pImageProgress = NULL;
	m_nProgressWidth = 0;
	m_nProgressHeight = 0;

	InitUi();
	GetImageSource();

	m_nStep = 1;
	SetTimer(1,100,NULL);
}

void CAppWelcomeProgressDlg::MyPaint()
{
	CPaintDC dc(this); 

	CRect rcClient;
	GetClientRect(&rcClient);

	CDC dcMem;
	CBitmap bmpMem;
	dcMem.CreateCompatibleDC(&dc);
	if(bmpMem.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height()))
	{
		CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);
		CWnd::DefWindowProc(WM_PAINT,(WPARAM)dcMem.m_hDC,0);

		DrawProgress(dcMem.m_hDC);
		DrawBackground(dcMem.m_hDC);
	//	DrawProgress(dcMem.m_hDC);

		dc.BitBlt(0,0,rcClient.right,rcClient.bottom,&dcMem,0,0,SRCCOPY);
		dcMem.SelectObject(pOldBmp);
		bmpMem.DeleteObject();
	}
	dcMem.DeleteDC();
}

void CAppWelcomeProgressDlg::InitUi()
{
	//对话框背景图片宽和高
	const int nBkBmpWidth  = 600;
	const int nBkBmpHeight = 356;
	//获得电脑显示器的像素宽度和像素高度
	int ax = GetDC()->GetDeviceCaps(HORZRES) - nBkBmpWidth; 
	int ay = GetDC()->GetDeviceCaps(VERTRES) - nBkBmpHeight;

	int nWidth = 0;   
	int nHeight = 0;	
	if(ax <= 0)
	{		ax =0;	}
	else
	{		ax = ax/2;	}
	if(ay <=0 )
	{		ay =0;	}
	else
	{		ay = ay/2;	}

	RECT clientRect;
	clientRect.left = ax;
	clientRect.top = ay;
	clientRect.right = clientRect.left + nBkBmpWidth;
	clientRect.bottom = clientRect.top + nBkBmpHeight;
	MoveWindow(&clientRect);
}

void CAppWelcomeProgressDlg::GetImageSource()
{
	CString sPath = _T("res\\background2.png");
	ImageFromIDResource(sPath,m_pImageBackground);
//	ImageFromIDResource(IDB_PNG_BG,_T("PNG"),m_pImageBackground);
	m_nBackgroundWidth  = m_pImageBackground->GetWidth();
	m_nBackgroundHeight = m_pImageBackground->GetHeight();

	sPath = _T("res\\progress2.png");
	ImageFromIDResource(sPath,m_pImageProgress);
	//ImageFromIDResource(IDB_PNG_HD,_T("PNG"),m_pImagePic);
	m_nProgressWidth  = m_pImageProgress->GetWidth();
	m_nProgressHeight = m_pImageProgress->GetHeight();
}

void CAppWelcomeProgressDlg::DrawBackground(HDC hDC)
{
	RECT rct;
	GetWindowRect(&rct);
	POINT ptWinPos={rct.left,rct.top};
	Graphics graph(hDC);

	Point points[] = { Point(0, 0), 
		Point(m_nBackgroundWidth, 0), 
		Point(0, m_nBackgroundHeight),
	};
	graph.DrawImage(m_pImageBackground, points, 3);
	graph.ReleaseHDC(hDC);
}

void CAppWelcomeProgressDlg::DrawProgress(HDC hDC)
{
	RECT rct;
	GetWindowRect(&rct);
	POINT ptWinPos={rct.left,rct.top};
	Graphics graph(hDC);

	int nHorOffset = 50;
	int nVerOffset = 100;
	nHorOffset = -400 + m_nStep*40;

	Point points[] = { Point(nHorOffset, nVerOffset), 
		               Point(nHorOffset+m_nProgressWidth, nVerOffset), 
					   Point(nHorOffset, m_nProgressHeight+nVerOffset),
					};

	graph.DrawImage(m_pImageProgress, points, 3);
	graph.ReleaseHDC(hDC);
}

void CAppWelcomeProgressDlg::OnTimer(UINT_PTR nIDEvent)
{
	RECT rect;
	GetClientRect(&rect);
	InvalidateRect(&rect,false);

	m_nStep++;

	if(m_nStep > 10)
	{
		OnOK();
	}

	CDialog::OnTimer(nIDEvent);
}

BOOL CAppWelcomeProgressDlg::ImageFromIDResource(UINT nID, LPCTSTR sTR, Image *&pImg)
{
	HINSTANCE hInst = AfxGetResourceHandle();
	HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type
	if (!hRsrc)
		return FALSE;

	// load resource into memory
	DWORD len = SizeofResource(hInst, hRsrc);
	BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
	if (!lpRsrc)
		return FALSE;

	// Allocate global memory on which to create stream
	HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
	BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
	memcpy(pmem,lpRsrc,len);
	IStream* pstm;
	CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);

	// load from stream
	pImg=Gdiplus::Image::FromStream(pstm);

	// free/release stuff
	GlobalUnlock(m_hMem);
	pstm->Release();
	FreeResource(lpRsrc);

	return TRUE;
}

BOOL CAppWelcomeProgressDlg::ImageFromIDResource(CString sFilePathName, Image *&pImg)
{
	// load file into memory
	DWORD len = 0;
	HANDLE hFile;
	DWORD  size1,readbyte;
	hFile=CreateFile(sFilePathName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
	if(INVALID_HANDLE_VALUE == hFile)
	{
		return FALSE;
	}
	len=GetFileSize(hFile,&size1);
	if(0xFFFFFFFF == len)
	{
		CloseHandle(hFile);
		return FALSE;
	}

	// Allocate global memory on which to create stream
	HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
	BYTE* pmem = (BYTE*)GlobalLock(m_hMem);

	ReadFile(hFile,pmem,len,&readbyte,NULL);
	IStream* pstm;
	CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);

	// load from stream
	pImg=Gdiplus::Image::FromStream(pstm);

	// free/release stuff
	GlobalUnlock(m_hMem);
	pstm->Release();

	return TRUE;
}

源码下载


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值