[转载]MFC绘制动态曲线,用双缓冲绘图技术防闪烁.pdfVIP

[转载]MFC绘制动态曲线,用双缓冲绘图技术防闪烁.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

[转转载载]MFC绘绘制制动动态态曲曲线线,,⽤⽤双双缓缓冲冲绘绘图图技技术术防防闪闪烁烁

先上效果图

随着时间的推移,曲线向平移,同时X轴的时间坐标跟着更新。

⼀、如何绘制动态曲线

所谓动画,都是⼀帧⼀帧的图像连续呈现在⽤户⾯前形成的。所以如果你掌握了如何绘制静态曲线,那么学会绘制动态曲线也不远啦,

只需要创建⼀个定时器(⽐如调⽤MFC中的SetTimmer函数),每隔⼀定时间(⽐如1ms),调⽤OnPaint或者OnDraw函数,绘制当前帧

图像即可。

这⾥需要注意的是,绘制图像的代码需要写在OnPaint或者OnDraw函数中,因为当窗⼝失效(⽐如最⼩化)恢复后,会重新绘制当前

窗⼝,窗⼝之前的⾃绘图像会丢失。⽽把绘图代码写在OnPaint或者OnDraw中就是为了让窗⼝每次重绘时也能重绘你⾃⼰画的图像,避免

出现窗⼝最⼩化再恢复后,⾃⼰画的图像丢失的尴尬情况。

另外绘制当前帧图像之前,记得⽤InvalidateRect函数清除上⼀帧图像,不然各帧图像会背景的堆叠。

⽐如我想清除窗⼝中(0,0)和(100,100)这两点确定的矩形中的图像,代码如下:

CRectRect;

Rect.top0;

Rect.left0;

Rect.bottom100;

Rect.right100;

InvalidateRect(Rect);

根据上⾯的思路,我们每隔⼀定时间绘制⼀幅图像,可是如果每次绘制的图像都是完全相同的,那么图像看起来也是静态的。如何让曲

线动起来呢?我们需要为⾃⼰绘图的代码设计⼀个输⼊,即在当前时刻曲线上各个点的坐标信息。随着时间的推移,令曲线上各个点的坐标

随之变化,这样每次绘图都是基于当前时刻的曲线坐标绘制的,控制好曲线坐标的变化,也就能让你绘制的曲线乖乖的动起来。

上⾯提到了曲线上各个点的坐标信息,这个信息可以⽤多种数据结构储存,不过笔者推荐使⽤STL中的deque数据结构储存。为什么

呢?需求决定选择。让我们先想想在绘制图像的过程中需要对这个数据进⾏哪些操作。

1、需要遍历这个数据,获取各个点的坐标以便绘图,所以选择的数据结构必须有较⾼的遍历效率。

2、当曲线上的点横向上充满了横坐标轴提供的显⽰范围,需要将曲线最边的点的坐标移除,然后在曲线最左边添加下⼀个新点的坐

标,以实现曲线向平移的效果。所以选择的数据结构需要⽀持前端和后端元素的添加删除操作,⼤家很⾃然会想到队列。

STL中的list容器也能很轻松的实现队列功能,但是list还⽀持任意位置元素的添加和删除操作,功能上的冗余决定了list需要花费更多的

时间来实现我们的需求,事实上遍历⼀个deque常常⽐遍历⼀个list快⼏⼗倍,原因在这⾥就不赘述啦。

于是,笔者构建了这样的数据结构

dequepairTIME,VALUEm_dqDisplayData;

队列中的每个元素是⼀个pair,pair中存放坐标。维护这个数据结构的核⼼代码如下:

//如果队列长度超过了X轴⽅向上可绘的所有点的数量

if(m_dqDisplayData.size()XPointNum)

{

//将队列前端的坐标移除

m_dqDisplayData.pop_front();

//在队列后端添加新的坐标

m_dqDisplayData.push_back(make_pair(time,value));

}

else

{

m_dqDisplayData.push_back(make_pair(tiem,value));

}

前⾯介绍了如何让静态的曲线动起来,下⾯具体介绍绘制静态图像的主要技能:

1、画图⾸先需要找⼀位画家,MFC是这样获取⼀位画家的。

CDC*pDCGetDC();

记得这位画家画完本帧图像之后,打发他⾛⼈,闲⼈咱们养不起。

即必须⽤ReleaseDC(pDC);释放资源,否则会造成内存泄漏,因为GetDC();函数中分配了⼀些资源,这些资源关联在pDC指向的内存

中,如果不调⽤ReleaseDC,当pDC出作⽤域后,只是pDC这个32位的指针变量(也可以说它是⼀个整数变量)的内存释放了,pDC指

文档评论(0)

8d758 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档