这里大致的讲述一下如何在Visual C++中的MFC中实现带有图片叠加操作的图像动画。
一、导入图片资源
为了便于程序集成,把所有的图片都导入资源中,并进行资源ID的重命名。
二、创建DC
为了在Windows中显示图片,需要先创建一个DC,而在MFC中,则是创建CDC,为了防止闪烁,使用一种“离屏绘制”的技术——创建三个CDC,一个用来后台缓冲,另一个用来前台绘制,一个用来前台显示。
CDC memDC;//前台绘制
CDC OffDC;//后台缓冲
CDC*pDC;//前台显示
在OnInitDialog()函数中,
CClientDC dc(this);
OffDC.CreateCompatibleDC(&dc); //创建一个内存设备环境,以便在内存中保存位//图,并与指定的窗口设备环境相兼容;
memDC.CreateCompatibleDC(&dc);
pDC=new CDC;
pDC=GetDC();
SetTimer(1,70,NULL); //设置定时器
用LoadBitmap(资源ID)载入相应的位图,
三、绘制并显示位图
在OnTimer()函数中,绘制场景并显示。
memDC.SelectObject(&background);//将背景图写入内存
BitBlt(OffDC,0,65,319,108,memDC,0,65,SRCCOPY);
//将前台绘制送至后台缓冲
然后进行图片的叠加(要叠加的图片都是背景图上的一小部分)。
(1)直接COPY(覆盖)至背景图
memDC.SelectObject(&图片1); //将要叠加的图片写入前台绘制CDC
BitBlt(OffDC,69,136,24,18,memDC,0,0,SRCCOPY);
//将图片1覆盖至背景图指定位置后送给后台缓冲
(2)AND操作叠加图片1与背景图
memDC.SelectObject(&图片2);//将要叠加的图片写入前台绘制CDC
BitBlt(OffDC,point1.x,point1.y,bm.bmWidth,bm.bmHeight,memDC,0,0,SRCAND);
//将图片2在指定位置与背景图AND操作后送给后台缓冲
(3)另一种形式的与操作(主要为了解决闪烁问题)
memDC.SelectObject(&图片3); //将要叠加的图片写入前台绘制CDC
BitBlt(OffDC,point3.x,point3.y,53,17,memDC,0,0,BLACKNESS);
//将背景图指定位置涂黑
BitBlt(OffDC,point3.x,point3.y,53,17,memDC,0,0,SRCERASE);
//将背景图指定位置取反后与图片3与操作后送后台缓冲
最后显示位图:
pDC->BitBlt(0,65,319,108,&OffDC,0,65,SRCCOPY);//由后台缓冲读至绘图区
四、释放资源
在DetroyWindow()函数中,释放资源。
KillTimer(1);
memDC.DeleteDC();
OffDC.DeleteDC();
pDC->DeleteDC();
图片.DeleteObject();
五,注意事项
为了控制背景图中不同区域的动作,可以为其加入相应的计数器来计时。例如初始化t0为0,然后在OnTimer() 函数中加入以下语句
if(t0<4) t0++;
else t0=0;
则在t0为不同值时,可以显示相应的想要的图片。