基于MFC的实时数据动态显示界面设计
2013-06-23殷兴辉
聂 斐,殷兴辉
(河海大学 计算机与信息学院,江苏 南京 211100)
在工业控制和测量探测等领域中,对于一些时刻变化的物理量(如:温度,压力,速度等),我们常常要进行实时地监测。这就需要在测量测试的仪器仪表或控制系统的界面上,画出实时曲线图,供使用人员观测。本文基于太阳爆发活动实时监测系统的应用,对太阳温度进行实时显示。而通常的软件界面上,只是实时显示根据数据绘制的曲线,但是坐标幅度(纵坐标)上往往是恒定的[1]。当太阳出现爆发活动时,实测温度达到几万度,而爆发活动结束时,实测温度又回到几百度,因此,被监测的数据在不断变化,幅度的变化范围很大。当被监测数据从一个很大的波动幅度(几万度)突降到一个很小的波动幅度(几百度)时,就会导致绘制出的曲线缩在一起,在幅值较小的地方。这种曲线极不便于观测者实时观看与监测。本文在界面设计时,不仅实时监测数据绘制曲线,而且坐标幅度也根据实测数据在动态变化,非常利于观测者观测,使得人机交互界面更加友好便捷。
1 MFC简介
MFC(Microsoft Foundation Class,微软基础类库)是微软公司为了简化程序员的开发工作所开发的一套C++类的集合,是一套面向对象的函数库,以类的方式提供给用户使用。可以用它来编写Windows应用程序,该类的集合是按层次结构组织起来的,其中封装了大部分Windows API(Application Programming Interface)函数和Windows控件,它所包含的功能涉及到整个Windows操作系统。MFC不仅为用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件。使用MFC类库和Visual C++提供的高度可视的应用程序开发工具,可使应用程序开发变得更简单,极大地缩短开发周期,提高代码的可靠性和可重用性[2-4]。
2 界面设计与实现
2.1 总体目标
软件界面的开发依托微软公司推出的Visual C++6.0为开发平台,使用MFC的单文档视图框架来设计整个应用程序。为了监测太阳温度,软件界面上需要显示太阳温度的实时窗口。在观测太阳温度的实时窗口中,需要实时绘制太阳温度曲线图。基于面向对象的设计理念,我们可以用一个类来完成这样的工作。MFC中没有直接提供这样的类[5],JanVidar Berger编写的clPlot类可以画实时曲线,派生于CWnd类。但是并不能满足本系统的要求,本文进行了修改,加以改进,进而实现了实时数据的动态显示。
2.2 实现步骤与方法
不同于Jan Vidar Berger所写的clPlot类,本文在serie类的成员变量中构建了一个CList类的对象m_valuelist。CList类支持可访问顺序或按值排列的非独一对象的有序链表[6]。用这样一个链表,来存放实时监测的数据。该数据为一个结构体。定义如下:
以X轴(横坐标)为时间轴,Y轴(纵坐标)为太阳温度。在界面上,我们显示的是一分钟内的温度曲线。由于下位机设定的采样速率为一秒钟采集一个数据,传到上位机上,一分钟内为60个数据。那么,我们就将链表元素的个数设定为60个。每接收到一个新的数据,则添加在链表的尾部。如果接收到的数据超过60个了,则将链表的头元素去掉。这样,就使得链表的元素个数始终为60个,并且是最新的60个数据。这样即可以保证观测数据的实时性。另外,在添加新数据之后,我们还要判断其幅值的大小,即value结构体中的成员变量dValue。我们要把链表中所有数据的幅值的最大值和最小值,作为设定Y轴(纵坐标)标尺的依据。这样,坐标幅度就会根据数据幅值的变化而变化,绘制出的曲线图总是会占据整个坐标平面,即使数据幅值突降至某个小的幅度波动,曲线图也不会“挤”在一起,极大方便了使用人员的观测。
添加新数据使用的是clPlot类的AddPoint()函数,该函数调用serie类的成员函数AddPoint()。在serie::AddPoint()中,将新接收的数据添加入链表中。本文定义了两个全局变量m_max和m_min,用来存放Y轴坐标标尺的最大值和最小值。这两个值如何得到呢?先找出链表中数据幅值的最大值和最小值,将它们作差,得到一个差值。m_max即为链表中数据幅值的最大值加上差值的1%;m_min即为链表中数据幅值的最小值减去差值的1%。那么将m_max和m_min作为参数,在clPlot::AddPoint()调 用 函 数SetLYRange()时,传 递 进去,来设定Y轴的坐标标尺。根据新数据添加的时间,调用函数SetBXRange(),设定X轴标尺。最后调用函数Invalidate(),该函数的作用是让窗口的整个客户区无效,当下一个WM_PAINT消息发生时,窗口就会重绘[7]。这样,每添加一个新的数据,就重新画一次曲线图,即达到实时显示的效果。
设计流程图如图1所示。
图1 设计流程图Fig.1 Flow chart of design
关键代码如下:
2.3 实验结果
图2为非动态显示。由图2(a)可以看到,太阳处于爆发时期,太阳温度在大约45 000度左右波动。但是由于浮动相对较小,看不出具体的范围。等到爆发活动结束,太阳温度大幅下降。可是由于非动态显示的局限性,在图2(b)上几乎看不出太阳温度值,更看不清楚波动范围。
图2 非动态显示Fig.2 Non-dynamic displaying
图3 为动态显示。由图3(a)可以清晰的反映出太阳温度浮动在45 000-45 500度。在14点13分的时候,太阳爆发活动结束,如图3(b),太阳温度突降至较小的幅值范围(300~800度)波动,坐标标尺幅值也跟随变化,如图3(c),曲线图也跟随动态变化,不似图2那样压缩在一起,无法看清波动的范围。非常便于使用者观测。
图3 动态显示Fig.3 Dynamic displaying
3 结束语
文中在Visual C++6.0开发平台上,利用MFC类库,设计了太阳爆发活动实时监测的软件界面,不仅实现了对太阳温度的实时监测,而且实现了实时数据曲线图的动态显示。极大地方便了用户的使用与观测。该方法已经应用于太阳爆发活动实时监测系统项目中,效果显著,因而,也可以应用在其他工程控制或探测测量等领域。
[1]赵融冰,艾力·玉苏甫,张晋,等.采用VC++的射电望远镜控制软件在Windows XP下的设计和实现[J].天文研究与技术,2007,4(1):64-71.ZHAO Rong-bing,Aili Yu,ZHANG Jin,et al.Design and realization of radio telescope control software in windows XP system with VC++[J].Astronomical Research&Technology,2007,4(1):64-71.
[2]梁普选.Visual C++程序设计与实践[M].北京:清华大学出版社,北京交通大学出版社,2005.
[3]刘雄鹰.MFC中显示数据控件手工编程绑定数据控件[J].电脑与信息技术,2012,20(4):49-51.LIU Xiong-ying.Displaying data control binding data control with manual programming in MFC[J].Computer and Information Technology,2012,20(4):49-51.
[4]仇巍,邢建国.基于MFC的产品结构树管理系统的实现[J].中国制造业信息化,2012,41(3):11-13.QIU Wei,XING Jian-guo.Development of product structure tree management system based on MFC [J].Manufacture Information Engineering of China,2012,41(3):11-13.
[5]申闫春.Visual C++案例教程[M].北京:清华大学出版社,北京交通大学出版社,2010.
[6]陈元琰.Visual C++.NET MFC类库应用详解[M].北京:科学出版社,2004.
[7]孙鑫.VC++深入详解[M].北京:电子工业出版社,2012.