中国电波传播研究所 王 平 杨丽丽
对某些采集设备而言,在相同条件下,同时显示几组的数据功能要求越来越多。为了研究设备性能,有时需要对关心的区域进行重点显示研究。这对显示控件提出了更高的要求。
本文提供一种多组数据的绘制方法,采用自定义数据链表存储显示数据,既可以实时加载显示数据,又可回放历史数据,可鼠标选择放大,鼠标滑动时也可显示当前鼠标点数据,显示效率高,可行性强,取得了理想效果。
本显示控件采用动态链表。动态链表的结构定义如下:
其中showdataarr是某时刻的组数据,如果要显示nSize组数据,那么showdataarr 就是nSize维数组;obtime代表时间。obDATALIST数据按一定的时间间隔加载到数据列表showdataList中。
实时数据加载到链表后,触发绘图消息;在绘图消息中处理数组数据链表,进行各个组的坐标转化,实现绘图更新。
本方法采用内存绘图,降低绘图闪烁。
定义obDATALISTITEM类型的结构体 showdata,初始化
obDATALISTITEM showdata;
memset(&showdata,0, sizeof(showdata));
进行时间赋值,将数据的采集时间赋给结构体
showdata.obtime = obtime;
进行显示数据赋值,对于显示的nSize组数据,先开辟内存
data. showdataarr = new double [nSize];
将当前时间获取的nSize组数据赋值到结构体的指针当中
Memcpy(data. Showdataarr,ddata,sizeof(double)* nSize);
将数据obDATALISTITEM结构体加载的缓冲链表,并随时更新链表数据中的最大最小值,便于对Y轴的显示范围进行自适应。
绘图主要工作是进行坐标转换。
对选中的显示区域,这个选中的区域,可以是正常的全部数据,也可以是用户关心的重点区域。
经过区域的坐标逆转换,计算出当前要显示的数据的索引为:
开始索引:m_nStartindex
结束索引:m_nEndindex
显示数据元素个数:nChooseSize = m_nEndindex- m_nStartindex +1;
对nSize组显示数据而言,利用for循环,根据选择的本组数据是否显示,进行nChooseSize
个数据的坐标转换并进行绘制。
nSize为显示数据的组数
nChooseSize 是每组数据的显示数据长度
对于每组显示数据,用循环代码绘图
鼠标在显示区域选中某一块,可关心区域进行放大显示。本功能的关键点是坐标的逆转换。
在鼠标的OnLButtonDown函数中,获取左上边界。
在鼠标的OnLButtonUp函数中,获取右下边界。
运用坐标逆转换,获取要显示的数据索引m_nStartindex、m_nEndindex,以及纵轴坐标m_fStartY、m_fEndY。
调用绘图消息进行绘图,即可显示选中的区域。
可以根据需要,点选需要选择某组数据,实现某些数据显示,某些数据不显示。将点选的结果,映射到BOOL型的数组m_bcheck[nSize]中,点选完毕之后,触发绘图函数,即可根据选择需要显示数据。
本方法在VC++6.0开发环境下,进行本多功能控件的绘图实现。所绘多组数据图如图1所示:
图1 某多组数据显示控件显示效果图
由实验结果可以,本绘制方法,对多组线性数据有良好的展示效果,并可根据需要进行点选显示数据,并可对关心区域进行重点显示。
[1]严蔚敏,吴伟您.数据结构(C语言版)[M].清华大学出版社,2002∶44-63.
[2]孙鑫,等.VC++6.0深入详解[M].电子工业出版社,2001∶404-434.