利用定时器和双缓冲技术在MFC中绘制动画

时间:2022-10-08 12:15:17

利用定时器和双缓冲技术在MFC中绘制动画

摘要:对MFC中动画绘制涉及到的两个重要技术做较全面的总结和提炼,创建了一个通用性较强的动画绘制程序框架。首先对MFC中定时器技术和双缓冲技术做出深入分析;其次创建一个动画绘制程序框架;最后通过几个动画程序验证该框架。该程序框架已经应用在实际工作中,证明该框架是精炼有效的。

关键词:MFC 动画 定时器 双缓冲

中图分类号:TP311.11 文献标识码:A 文章编号:1007-9416(2013)08-0129-01

1 定时器和双缓冲技术

MFC是微软公司推出的软件开发架构[1],在MFC中绘制动画常见于各类软件开发。动画绘制一种思路是利用循环语句加延迟函数的方式[2],另外一种思路就是利用定时器[3]定时更像图片绘制动画。后者在绘制过程中可以响应其他事件,因此应用十分广泛。

1.1 定时器技术

定时器可以向系统定时发送信号,触发OnTimer函数。在定时器使用过程中涉及到三个常用函数,分别对应着使用定时器的三个步骤。

(1)创建定时器。创建定时器使用SetTimer函数。MFC中提供两个SetTimer函数,一个是全局函数,可以在程序的任意位置调用。我们更常使用的是第二种SetTimer函数,由CWnd类重载。函数有三个参数,分别是定时器编号、时间间隔和回调函数[4]地址。

(2)处理定时器信号。MFC在OnTimer函数中处理定时器信号。OnTimer函数具有一个参数,是捕捉到的定时器编号。我们可以利用其区分不同的定时器信号,执行不同代码。

(3)销毁定时器。定时器也会占用一定的系统资源,所以必须及时销毁不用的定时器,否则会影响系统运行效率。MFC中使用KillTimer函数销毁定时器,该函数参数就是待销毁的定时器编号。

1.2 双缓冲技术

在Windows平台上,应用程序的图像设备接口被抽象化为设备上下文(Device Content,DC)。在MFC中,CDC类[5]是定义设备上下文对象的基类,所有绘图函数都在CDC基类中定义。

MFC中绘制动画的基本思路是在固定时间间隔内绘制图像,然后擦除旧图像再绘制新图像,这样连续起来就在人类的视觉上形成动画。为了实现这种“绘制-擦除-再绘制”的思路,较老的一种方法是在OnDraw函数中绘图,然后利用InValidate函数来清空屏幕,然后再绘制新图。因为绘制新旧两幅图像之间必定需要一定的计算和绘制时间,导致一个后果就是图像闪烁的很厉害。

为了避免闪烁,借助于双缓冲[6]的思想,我们可以在显示一幅图像的同时,在后台计算一幅新图像,并将新图像保存为一个完整的位图。当时间间隔到期后,一次性将新图像位图读入并显示出来即可。这样将大大节省计算和绘制的时间。实际运行中,人类的视觉基本感知不到任何闪烁。

2 动画绘制程序框架

作者在教学过程中利用上述技术创建了一个精炼高效的动画绘制程序框架,现将该程序框架的开发介绍如下。

第一步,创建一个标准的MFC单文档应用程序,项目名称为“Huitu”。然后在菜单栏中加一个“绘制”菜单,在其中添加一个“动画”菜单项,设置好对应的ID。

第二步,向Chuitu View类中添加一个布尔型成员变量donghuaflag,用于表示是否显示动画。

第三步,利用类向导创建对“动画”菜单项的响应函数。该函数的内容很简单,如下所示。

if(donghuaflag==true){

donghuaflag=false;

Set Timer(1,84,NULL);

}else{

donghuaflag=true;

KillTimer(1);

}

可以看出,当“动画”菜单项奇数次被点击时,程序将创建一个编号为1的定时器,动画开始显示,并将时间间隔定位84毫秒,一秒钟大概更新12幅图像。当菜单项偶数次被点击时,系统将销毁1号定时器,动画结束。

第四步,利用类向导添加对系统消息“WM_TIMER”的响应函数,默认函数名为“OnTimer”。这样一来,刚刚在菜单响应函数中创建的1号定时器发送的定时信号就会在这里被接受并处理。这里为了使程序的结构更加清晰,我们在OnTimer中调用一个用户自定义函数“MyDraw”,真正的绘制动画代码放到该函数中。

第五步,添加用户自定义函数MyDraw。函数中除了系统活动设备上下文类对象pDC外,再编码“CDC MemDC”创建一个缓存中的后台设备上下文类对象。编码“CBitmap MemBitmap”创建一个缓存中的位图对象。之后利用Create Compatible DC、Create Compatible Bitmap和Select Object函数初始化并绑定位图。然后就是用户代码,可以利用MemDC提供的各种绘图函数绘图。最后利用pDC的BitBlt函数一次性读入位图并显示。

至此,动画绘制程序框架创建完毕。

3 利用框架创建的动画实例

实际开发中我们在动画绘制程序框架中,只需在My Draw函数中的个人绘图代码部分加上自己想要绘制的图像程序代码即可实现绘制动画。(图1)所示是几幅较好的学生动画作品。

当然该框架比较简单,还存在较大的改进空间。例如可以实现保存图像功能,再如可以实现多幅动画同时显示功能等。这些想法都有待今后的研究中进一步实现。

参考文献

[1]侯俊杰.深入浅出MFC(第2版)[M].武汉:华中科技大学出版社,2001:1-15.

[2]郑阿奇.Visual C++6.0 应用案例教程[M].北京:电子工业出版社,2010:12-35.

[3]孙鑫.VC++深入详解(修订版)[M].北京:电子工业出版社,2012:247-258.

[4]王铬.回调函数在软件设计中的应用[J].河南教育学院学报(自然科学版),2003,vol. 12, NO.3:44-46.

[5]郭海英,董高云,钟廷修.用Visual C++6.0编写交互绘图程序[J].计算机应用,2000,vol. 20,NO.11:68-69.

[6]曾麒.MFC中双缓冲处理贴图闪屏问题[J].科技信息,2011,第3期:68-70.

上一篇:数字芯片控制的多档输出直流电源设计 下一篇:井下作业管柱绘制工具的设计与实现