附录2 利用Visual C++调用图片实现平面动画

本文介绍在Visual C++的MFC中实现带有图片叠加效果的图像动画过程,包括图片资源导入、创建DC、绘制及显示位图等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

这里大致的讲述一下如何在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覆盖至背景图指定位置后送给后台缓冲

2AND操作叠加图片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();

五,注意事项

  为了控制背景图中不同区域的动作,可以为其加入相应的计数器来计时。例如初始化t00,然后在OnTimer() 函数中加入以下语句

if(t0<4) t0++;

else t0=0;

则在t0为不同值时,可以显示相应的想要的图片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值