程序设计中,为了使我们的软件更加人性化,需要一个欢迎界面,显示一个几秒钟的动画。
我们知道图片分层的概念,我们也知道png图片具有透明效果,那么进度条的动画显示效果可以这样来制作:
.cpp文件
源码下载
我们知道图片分层的概念,我们也知道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);
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;
}
源码下载