在日常工作中,经常要进行数据处理、数据分析、数据查看等操作。为此,可采用3个控件来演示图表显示:第一个是类似Excel图表功能的MSChart控件;第二个是PictureBox控件,可直接在图片上绘制曲线;第三个是用于数据显示的MSFLex控件。其中,MSChart控件和MSFLex控件并没有在工具栏中,需要手动添加,如图2-15所示。
图2-15 在工具栏添加MSChart控件和MSFlex控件
在窗体布置上添加PictureBox、MSChart、MSFlex控件,分别命名为WorkPic、MyChart和DataGrid。其中,添加MSChart控件的窗体如图2-16所示。
图2-16 在程序窗体中插入MSChart控件
下面演示翼型数据的读取和显示。
首先,构造一个翼型数据类型。在工程列表中单击右键,选择添加一个变量模块,命名为VAR,如图2-17所示。
图2-17 在右侧工程目录中插入变量模块
添加以下代码:
Public Type Foil Name As String NI As Integer X()As Double Y()As Double End Type
其次,定义该数据类型的一个变量:
Public MyFoil As Foil
再次,添加关于文件操作的一些变量:
Public TFileName As String Public TStr As String
表2-1 NACA 0012翼型数据格式
在软件开发中,一般使用多个模块来定义不同的变量类型或操作方法,如常规变量定义模块、数学方法模块、过程函数模块等。在大型软件开发中,该定义方式便于实现对相关变量、函数、过程的快速查找、添加、分析、调试。
读取的原始翼型数据来自Profili软件,其数据格式如表2-1所示。第一行为翼型名称;第二行及以后为翼型数据,第一列为 X 坐标,第二列为 Y 坐标。
为了更加合理地管理项目文件,我们在开发目录下建立一个Foil文件夹来存放翼型数据文件,再添加一个过程函数模块Fun,最后添加对翼型数据读取的过程:
Public Sub ReadFile(TFileName As String) Open TFileName For Input As #1 Input #1, MyFoil.Name i = 1 Do While Not EOF(1) ReDim Preserve MyFoil.X(i)As Double ReDim Preserve MyFoil.Y(i)As Double Input #1, MyFoil.X(i), MyFoil.Y(i) i = i + 1 Loop MyFoil.NI = i - 1 Close #1 End Sub
第一步,传递一个要打开的翼型数据文件,文件号为1。
第二步,根据格式,第一行是读取翼型数据的名称。
第三步,由于不知道翼型数据文件有多少行、数据点有多少个,因此我们在循环读取的时候用到了EOF判断,判断文件是否读取结束。
第四步,在定义翼型数据类型的时候,没有指定 X、 Y 变量的个数,翼型数据类型为可变数组类型。因此,在读取数据的过程中可不断增加数组长度。可变数组的定义用ReDim,ReDim会构建一个空白的数组。在不断拓展中,希望之前的数据得到保留,因此需要加入Preserve。
再次回到窗体设计,2.1节介绍对文件目录的访问。现在我们可以通过双击文件列表来打开文件。双击文件列表Filelist控件,进入代码编辑区,在过程下拉菜单里选择DblClick事件,开始添加代码。
文件列表FileList中的文件所在的目录是已知的,来自FileList.Path。双击文件列表可获得该文件的索引信息FileList.ListIndex。文件列表本身就是个数组,通过索引信息可获取文件名称Me.FileList.List(Me.FileList.ListIndex)。读取翼型数据的代码如下:
Private Sub FileList_DblClick() TFileName = Me.FileList.Path +”\”+ Me.FileList.List(Me.FileList.ListIndex) Call Fun.ReadFile(TFileName) MsgBox "文件读取完毕!", vbOKOnly, "温馨提示" End Sub
读取完毕后,需要把数据显示出来。
首先,用DataGrid来显示文本。在窗体的代码编辑区增加一个数据显示的过程:
Public Sub DataShow() Me.DataGrid.Clear Me.DataGrid.Rows = MyFoil.NI + 1 Me.DataGrid.Cols = 3 Me.DataGrid.TextMatrix(0, 0)= "Num" Me.DataGrid.TextMatrix(0, 1)= "X" Me.DataGrid.TextMatrix(0, 2)= "Y" For i = 1 To MyFoil.NI Me.DataGrid.TextMatrix(i, 0)= i Me.DataGrid.TextMatrix(i, 1)= MyFoil.X(i) Me.DataGrid.TextMatrix(i, 2)= MyFoil.Y(i) Next i End Sub
数据显示代码运行结果如图2-18所示。
图2-18 数据显示代码运行结果
其次,可以用MSChart控件将数据进行图表显示。在默认设置中,MSChart控件显示的是柱状图。我们可以选中控件,然后单击右键进入样式设计。MSChart控件的绘图设置同Excel。设置后的曲线显示如图2-19所示。
图2-19 曲线显示
图2-19中的曲线不是很好看,在控件的属性栏里,可将原始数据删除,调行(Column)和列(Row)的数值,然后删除对应Data下的数,其运行结果如图2-20所示。
图2-20 绘图区显示
在大部分关于曲线的显示中,比如实验数据的查看,纵横坐标刻度一致。在Form_Load()下添加以下代码:
Me.MyChart.Plot.UniformAxis = False
其运行结果如图2-21所示。
图2-21 调整绘图区
现在添加图形显示的代码。MSChart控件与Excel表类似,因此我们只要设定行数、列数,并逐个在对应的行列位置填入数据即可。代码如下:
Public Sub DrawChart() Me.MyChart.RowCount = MyFoil.NI Me.MyChart.ColumnCount = 2 For i = 1 To MyFoil.NI Me.MyChart.Row = i Me.MyChart.Column = 1 Me.MyChart.Data = MyFoil.X(i) Me.MyChart.Row = i Me.MyChart.Column = 2 Me.MyChart.Data = MyFoil.Y(i) Next i End Sub
双击文件列表,补充绘图代码,启动绘图函数:
Private Sub FileList_DblClick() TFileName = Me.FileList.Path + "\"_ + Me.FileList.List(Me.FileList.ListIndex) Call Fun.ReadFile(TFileName) MsgBox "文件读取完毕!", vbOKOnly, "温馨提示" Call DataShow Call Me.DrawChart End Sub
其运行结果如图2-22所示。
图2-22 绘制翼型数据曲线
图2-22显示的是几何信息,要求纵横坐标的刻度保持一致。因此,需要将刻度一致关闭的那行代码改为注释。其运行结果如图2-23所示。
图2-23 调整比例
现在保证了图形显示的纵横刻度的一致。为进一步优化图形,可以手动配置网格。添加如下初始化代码:
Public Sub IniChart() Me.MyChart.Plot.Axis(VtChAxisIdX).ValueScale.Auto = False Me.MyChart.Plot.Axis(VtChAxisIdX).ValueScale.Maximum = 1# Me.MyChart.Plot.Axis(VtChAxisIdX).ValueScale.Minimum = 0 Me.MyChart.Plot.Axis(VtChAxisIdX).ValueScale.MajorDivision = 10 Me.MyChart.Plot.Axis(VtChAxisIdY).ValueScale.Auto = False Me.MyChart.Plot.Axis(VtChAxisIdY).ValueScale.Maximum = 0.2 Me.MyChart.Plot.Axis(VtChAxisIdY).ValueScale.Minimum = -0.2 Me.MyChart.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 4 End Sub
将这个初始化的过程添加到窗体载入过程,其运行结果如图2-24所示。显然,图2-24所示曲线更为协调。
Private Sub Form_Load() Me.mAllFile.Checked = True 'Me.MyChart.Plot.UniformAxis = False Call Me.IniChart End Sub
图2-24 优化显示
现在使用PictureBox控件来绘制曲线。绘制原理如下:
(1)清除绘图区域,并设置底色。
(2)规定绘图区域的坐标系统,为了使坐标系统的比例与控件比例一致,需要获取控件的高度(height)和宽度(width)属性。
(3)设置网格颜色,设置网格线的粗细,绘制网格,绘制标注。
(4)设置曲线颜色,设置曲线粗细,绘制曲线。
返回窗体的代码编辑区,增加DrawPic()过程,该过程又细分为两个子过程:一个是控件的初始化,另一个是曲线的绘制。补充如下代码:
Public Sub IniPic() Dim DxDy As Double Dim OthoX As Double Dim OthoY As Double Dim XNI As Integer Dim YNI As Integer Dim YBegin As Double Dim YEnd As Double DxDy = Me.WorkPic.Width / Me.WorkPic.Height OthoX = 1.2 OthoY = OthoX / DxDy XNI = 10 YNI = Int(OthoY / 0.1) YBegin = -1 * Int((YNI - 1)/ 2)* 0.1 YEnd = -1 * YBegin YNI = (YEnd - YBegin)/ 0.1 Me.WorkPic.Cls Me.WorkPic.BackColor = vbWhite Me.WorkPic.Scale (-0.1, OthoY / 2)-(1.1, -OthoY / 2) Me.WorkPic.ForeColor = vbBlack Me.WorkPic.DrawWidth = 1 For i = 0 To XNI Me.WorkPic.Line (i * 0.1, YBegin)-(i * 0.1, YEnd) Me.WorkPic.CurrentX = i * 0.1 - 0.02 Me.WorkPic.CurrentY = YBegin - 0.02 Me.WorkPic.Print Format(i * 0.1, "0.0") Next i For i = 0 To YNI Me.WorkPic.Line (0, YBegin + 0.1 * i)-(1#, YBegin + 0.1 * i) Me.WorkPic.CurrentX = -0.08 Me.WorkPic.CurrentY = YBegin + 0.1 * i + 0.02 Me.WorkPic.Print Format(YBegin + 0.1 * i, "0.00") Next i End Sub Public Sub DrawPoint() Me.WorkPic.ForeColor = vbRed Me.WorkPic.DrawWidth = 3 For i = 1 To MyFoil.NI - 1 Me.WorkPic.Line (MyFoil.X(i), MyFoil.Y(i))-(MyFoil.X(i + 1), MyFoil.Y(i + 1)) Next i End Sub Public Sub DrawPic() Call IniPic Call DrawPoint End Sub
在文件列表双击事件中补充PictureBox控件的绘图代码:
Private Sub FileList_DblClick() TFileName = Me.FileList.Path + "\"_ + Me.FileList.List(Me.FileList.ListIndex) Call Fun.ReadFile(TFileName) MsgBox "文件读取完毕!", vbOKOnly, "温馨提示" Call DataShow Call Me.DrawChart Call Me.DrawPic End Sub
在窗体启动的时候,增加PictureBox控件的初始化,即绘制网格。对于直接绘图,需要在PictureBox控件属性栏中,将AutoRedraw设置为True,并在窗体载入过程中添加如下代码:
Private Sub Form_Load() Me.mAllFile.Checked = True 'Me.MyChart.Plot.UniformAxis = False Call Me.IniChart Call Me.IniPic End Sub
其运行结果如图2-25所示。
图2-25 绘制翼型显示区
稍微调整一下左右边界,使图2-25所示的上下两个网格对应起来。修改代码如下:
Me.WorkPic.Scale(-0.13, OthoY / 2)-(1.07, -OthoY / 2)
其运行结果如图2-26所示。
图2-26 调整边界参数
双击翼型数据文件后,显示如图2-27所示的运行结果,MSChart控件绘制的曲线是可以选择的。
图2-27 运行结果
本节介绍如何使用MSChart控件绘制曲线、使用PictureBox控件进行几何显示,并说明了它们的差异。在大部分情况下,MSChart控件可比较快速地绘制曲线。对于几何显示,就需要在PictureBox控件下进行复杂的操作。