一、概述
两个月前制作一个项目,需要用到上位机实时显示波形的功能,说实话,在当时我的水平来看,用上位机进行串口的读写这样的功能没问题,但是一遇见画图之类的功能我就瞬间蛋疼了,于是我就上网搜索相关的源代码,很幸运,我搜到了xf_z1988的波形显示控件,当时我感觉如释重负,终于看到了胜利的曙光。同时他还写了一篇关于这个控件的功能介绍http://www.cnblogs.com/xf_z1988/archive/2010/05/11/CSharp_WinForm_Waveform.html
通过仔细拜读,感觉楼主水平果然高超,思维缜密代码清晰,实为我辈学习的对象。里边的功能十分强大,使用十分方便,十分给力。
在项目程序设计的过程中,由于要求比较苛刻,这个波形控件的功能有点不能满足我的需求,于是在一个风雷交加的晚上,我暗暗下定决心,面对这座大山进行代码的修改。到目前为止,我对这个控件做出来了多处修改,具体修改内容如下:
(1)修改了“默认坐标范围”的功能,它现在表示在接收数据的时候,横坐标范围不变,波形图像一直向左平移,且波形的结尾处一直处于波形控件的右边。
(2)简化了放大波形的过程,添加了波形缩小的功能。
(3) 添加了波形拖动的功能,可以很方便的查看历史记录。
(4)添加显示曲线坐标的功能,可以很方便的显示出曲线上某一点的实际坐标,matlab风格的。
(5)添加了截图的功能。
(6) 添加了清屏的按钮。
(7)支持文件内容的读取与显示(由于显示风格比较复杂,没有把波形的储存集成到控件本身,需要用外部的程序进行实现,这段代码在下边会详细介绍,代码很简单,容易实现)。
(8)支持纯链表显示(就是原控件的工作模式),纯文件内容显示,链表和文件混合显示,方便对历史波形进行查看。
(9)在显示波形之前,添加了设置波形显示模式的内容,可以方便不同情况下的显示状况(这一点在下边详细介绍,在这里不做解释)。
(10)优化了部分驱动算法,删除了部分没用的代码(可能是楼主调试的时候忘了删除无用代码吧)。
OK就这些,虽然添加的东西不太多,但是加上之后给人的体验还是蛮不错的。奥对,我把留出来的接口函数里边的ref关键字统统去掉了,只要不是int、double之类的基本类型或者是struct的结构类型,都是可以不用ref关键字的。
二、修改
对于波形的显示功能,我没有做任何修改该,包括标尺、网格、背景颜色设置,这些内容的具体实现方式请看原作者的博文,就是上边的连接,我这里就不再做解释了。
除了这个之外,别的函数我基本上都动过手术刀,你要问我我到底改过什么地方,这些功能是是什么,我只能轻轻的告诉你:我忘了。我现在只能记住一些主要的地方,那些局部细节的修改是在是太多了,我没法一一列举出来,特别是我这里支持对波形文件的读取,那么对数据的处理基本上改了个遍,现在想想都头皮发麻。鉴于此,在这里我按照逻辑顺序,由浅入深把主要的修改内容简单的介绍一下,我尽量保证文章的简单,突出重点。
2.1截图功能
好多内容都是牵一发而动全身的,只有这个截图功能相对比较独立。
关于截图我是把功能放到FuncPrivate中的CutPic函数里边的。只要调用这个函数,在哪个地方都可以截图。
private voidCutPic()
{
Bitmap bit= new Bitmap(this.Width, this.Height);
Graphics g=Graphics.FromImage(bit);
g.CompositingQuality= System.Drawing.Drawing2D.CompositingQuality.HighQuality; //设置图像质量
g.CopyFromScreen(pictureBoxLeft.PointToScreen(Point.Empty), Point