编者记:09年暑假正好在学院实验室呆了一段时间,做了个完整的上位机软件(具体实现:根据下位机的指令,实现通过串口来操纵下位机进行实验,并将采集的数据进行处理和保存,并以图形的方式显示),整个项目边学C#WinForm边设计,这个波形显示控件就是项目中的一部分,也花了自己绝大多数时间。暑假一结束,也就没有再去接触C#了,主要精力放在C++,Windows编程上去了。此外,顺便将该波形显示控件当作自己毕业设计的内容,下文实际上是节选自自己的本科毕业论文的呵呵,希望对大家能有所帮助。由于自己是个C#新手,所以代码以及文章有疏漏、错误、不妥之处在所难免,欢迎交流哈(现在看着十个月前写的代码,感想颇多......)欢迎转载,但请注明出处(通宵整理排版==很不容易的哈)(写这篇文章之时,大学再一个半月就结束了,目前在学C++、Windows编程、希望能找到个适合的工作吧)“基于C#的波形显示控件”设计于09年暑假源代码奉上呵呵:博客园下载|CSDN下载解压密码:CSharp_WinForm_Waveform《基于C#的波形显示控件的实现》写于2009年9月跳到文章目录(注意这里是采用锚链接,订阅的朋友可能访问会失效的,例如QQ邮箱中的订阅==还是访问原文吧)“基于C#的波形显示控件的演示程序”为配套控件使用而设计的(演示程序源代码同控件源代码一起奉上了)下面先上几张图,大家可以先了解最后做出来是个什么东西:再奉上两个波形显示控件的演示视频(两个视频内容差不多的呵呵):摘要计算机技术的飞速发展使得其在自动化系统中的应用日益增强。大量监控、图像数据显示软件活跃在自动化工业及自动化教学领域。同时,软件系统的日益复杂化使得模块化开发变得尤为重要。本课题所设计的基于C#的波形显示控件就可在微软.NET平台下进行代码功能重用,达到模块化开发和快速开发的目的,使得程序员能够集中精力设计软件的具体业务流程,而不必担心波形呈现的问题。本文先介绍了.NET平台下用户控件开发的基本方法,以及用C#描述的GDI+图形开发技术,然后提出一种基于C#的波形显示控件的设计思路,并对波形坐标值转换、坐标标尺、工具栏、局部放大等具体的设计细节进行详细解析。本课题设计的波形显示控件实现了同时显示多条数据曲线、局部放大查看、波形显示自动调整最佳坐标范围、动态显示波形等功能。创新之处在于设计了一种方法,使得波形显示控件的坐标轴的起点值和终点值能够以浮点数显示,并自动根据当前波形显示控件的大小,描绘出符合用户视觉的坐标标尺。最后,还设计了一个波形显示控件的演示程序,用于介绍该控件的使用方法以及功能测试,并提出了该波形显示控件可改进的地方。关键词:波形显示控件;C#;GDI+;动态波形目录(注意这里是采用锚链接,订阅的朋友可能访问会失效的,例如QQ邮箱中的订阅==还是访问原文吧)1绪论1.1课题背景1.2波形显示控件实现的功能2主要开发技术介绍2.1.NET用户控件介绍2.2GDI+技术介绍3波形显示控件整体设计3.1数据存储结构的设计3.2控件界面模块的设计3.3控件工作流程的设计4波形显示控件各细节的实现4.1坐标值和标尺的实现4.1.1坐标相关的成员变量4.1.2坐标标定权值的概念4.1.3坐标标尺的绘制4.1.4子标尺线的选择性显示4.2数据点的描绘4.2.1数据值转换为坐标值4.2.2溢出坐标范围的数据点的处理4.2.3遍历所有数据线并绘制出4.3波形显示区域网格的实现4.3.1网格相关的成员变量4.3.2网格的绘制4.4工具栏按钮的实现4.4.1工具栏按钮相互关系4.4.2工具栏提示标签的实现4.5波形放大功能的实现4.5.1局部放大选择框的实现4.5.2放大选择框的鼠标操作4.5.3放大选择框的按钮操作4.5.4更新数据显示范围为放大的范围4.6坐标自动调整及恢复默认坐标的实现4.6.1坐标自动调整功能4.6.2恢复默认坐标范围功能4.7波形显示控件接口的实现4.7.1控件基本属性4.7.2控件外观样式4.7.3控件绘图接口4.8波形显示控件其他细节的处理4.8.1坐标值产生遮盖时的处理4.8.2波形显示控件大小改变时的处理4.8.3按钮点击时进行禁用操作4.8.4右键菜单的显示4.8.5XML注释以及智能提示5波形显示控件功能的演示和使用5.1波形显示控件演示程序的设计5.2波形显示控件功能的演示5.2.1外观样式的更改5.2.2波形显示演示5.2.3波形显示控件在实际项目中的使用6课题总结参考文献1绪论1.1课题背景波形显示控件广泛见于监控测量,图像数据显示等自动化相关软件中,更是组态软件必不可少的一部分。例如美国国家仪器有限公司(NationalInstruments)的NIMeasurementStudio集成式套件以及LabView图形化程序开发环境等,都包含技术成熟的波形显示控件,功能丰富且强大。目前购买成熟的自动控制相关的第三方控件库往往需要支付较高的费用,且大多数项目只用到些许专业性控件,例如一个喷管实验平台软件,图形用户界面只需要波形显示控件、U型差计控件和压力表控件,因此不适合科研机构以及中小型软件开发公司。所以掌握简单的控件开发技术,并开发属于自己团队或公司的控件库,从而降低软件开发成本,显得十分必要。微软的.NET解决方案依据其对已有代码的互操作性、简化部署、分布式、高效开发等诸多优点,完全胜任自动化系统软件的开发。C#是微软为.NET平台开发的一门语言,通过.NET平台可以轻松使用GDI+技术开发可重用的用户图形界面控件。GDI+是目前在Windows窗体应用程序中以编程方式呈现图形的唯一方法,它使程序设计者可以创建图形、绘制文本以及将图形图像作为对象操作,旨在提供较好的性能并且易于使用。波形显示控件因为涉及到坐标系、数据显示方式、精确度、实时性等因素,存在一定的开发难度。本课题意在使用微软.NET平台下的C#语言,提供一种坐标计算方法,解决自动调整最佳坐标范围,以符合用户视觉的方式显示坐标标尺,并通过GDI+技术显示波形数据,具有一定的实际开发参考价值。开发完成后的波形显示控件,可以快速嵌入到.NET平台下的软件工程中,开发者只需简单的操作,就可以使用该控件友好地显示波形数据,从而达到快速开发的目的。回到目录1.2波形显示控件实现的功能本课题所设计的波形显示控件,主要实现以下功能:(1)多条波形数据的显示。该波形显示控件能够同时显示多条波形数据,用户能够控制每条波形数据的显示颜色、线宽、线帽、以及线转折的样式。并且提供了三种波形数据显示的方式:连续数据线、离散点、条形图。(2)友好坐标标尺的显示。该波形显示控件能够根据当前显示数据的坐标范围,友好地显示坐标标尺。例如X轴坐标起始值为34.2,结束坐标值为100.7,则控件不是简单得将坐标10等分并显示并不友好的坐标值,而是通过计算当前波形显示控件的大小,显示40、50……这样的友好的坐标值,并判断是否需要继续在40到50的坐标值之间显示更小分度的坐标值。(3)波形显示区域网格的显示。该波形显示控件可以显示同坐标标尺的坐标线相对应的网格,使得用户能够更直观地观察波形数据。(4)波形的局部放大。该波形显示控件提供了波形局部放大的功能。并根据实际使用和测试,控制了波形放大的精度,以免产生数据溢出的问题。(5)坐标自动调整。该波形显示控件能够根据当前要显示的波形数据的值,自动选择最佳的坐标范围,来直观地在控件的波形显示区域显示完整的波形曲线。(6)外观颜色方案的修改。该波形显示控件能够修改外观样式,诸如背景色、网格颜色、坐标线颜色、坐标值颜色等都可以进行调整,以使控件外观能够符合软件整体风格。(7)其他细节。该波形显示控件还设计了一个工具栏,可以方面地使用网格显示、局部放大、坐标自动调整、恢复默认坐标功能。另外还设计右键菜单,能够显示当前鼠标位置的具体坐标值,以及工具栏按钮的快捷按钮。回到目录2主要开发技术介绍2.1.NET用户控件介绍在微软.NET平台下,可以设计出在应用程序内部或应用程序之间提供一致性行为和用户界面的复合控件,即用户控件。用户控件可以是某个应用程序的本地控件,也可以编译成DLL供多个应用程序使用。用户控件极大限度的帮助程序员进行代码重用和快速开发。通常用户控件通过继承UserControl基类,并组合微软提供的基础控件,如Button控件、PictureBox控件、Label控件等,然后进行功能的扩充和组合,从而创建出特定功能的用户控件。在VisualStudio2005下使用C#开发.NET用户控件,可以通过新建Windows控件库来实现。创建成功后软件会自动从UserControl基类继承一个类,并允许通过设计视图添加所需要的已有控件。图2-1设计用户控件界面设计好大致的界面后,就可以着手设计具体的代码,用户控件通常通过对消息处理函数的编写,来实现特定的功能,并将控件中的各个模块联系起来。用户控件还需要设计出公开的接口属性和方法给控件的使用者,这样控件的使用者就能够调用公开的属性和方法,来实现对控件的操作和控制。另外,在编写控件的时候对各个属性和方法编写XML注释,并在生成控件的时候输出XML文档文件,这样控件使用者在使用该控件的时候,能够享受VisualStudio智能提示带来的便利。编译运行后可以检查基本的控件效果:图2-2用户控件的调试运行最后可以通过项目属性设置程序集信息。图2-3设置程序集信息这样,一个用户控件就设计完成了。用户控件自身不能独立作为程序运行,需要嵌入到特定的软件中。可以通过选择工具箱,添加新创建的.NETFramework组件,添加到工具箱中。其用法同微软提供的基础控件一样,可以通过拖拽的方式进行使用。回到目录2.2GDI+技术介绍GDI+是.NETFramework类库,用于进行图形编程。它是一种基于GDI的技术,GDI即WindowsGraphicalDeviceInterface,是WindowsAPI(应用程序编程接口)中处理图形的部分。GDI+是目前在Windows窗口应用程序中以编程方式呈现图形的唯一方法,它使程序设计者可以创建图形、绘制文本以及将图形图像作为对象操作,旨在提供较好的性能并且易于使用。GDI+技术在Windows应用程序中得到了广泛的应用,使得Windows图形图像编程变得格外得容易。目前Windows平台下的大量应用软件的图形界面通过GDI+技术实现。利用GDI+技术可以方便地在屏幕、打印机或者其他输出设备上输出图形、文本等内容,程序员无需关心硬件设备和设备驱动,就可以编写出设备无关的应用程序。一些新兴的信息化软件通过GDI+技术能实现动态交互的高级效果,比如可视化电子地图。在使用GDI+绘图之前,需要获得绘图对象Graphics,通常在编写控件的Paint事件时,Graphics对象可通过PaintEventArgs参数获得。所有的绘制过程都是面向对象的,例如实例化1像素的实线黑色画笔并绘制线条,可用如下的方式创建:GraphicsGrap=e.Graphics;Penp=newPen(Color.Black);Grap.DrawLine(p,0,0,100,100);p.Dispose();若填充一个区域的颜色,则代码样式如下所示:SolidBrushb=newSolidBrush(Color.Red);Grap.FillRectangle(b,0,0,10,10);b.Dispose();其直观的操作方式使得程序员能快速绘制椭圆,椭圆弧,矩形,贝塞尔曲线,路径等。通过GDI+技术创建自定义控件能实现各种功能。只需要在建立自定义控件后,编写响应Paint事件的代码,通过GDI+技术绘制必须的图形,就可以控制自定义控件的外观。本课题设计的波形显示控件,大量得运用了GDI+技术进行绘图操作,使得控件能够呈现出出色的界面效果。回到目录3波形显示控件整