在VB中怎么用鼠标画曲线

在VB中怎么用鼠标画曲线,第1张

分类: 电脑/网络 >>程序设计 >>其他编程语言

问题描述:

如何用VB做一个程序可以用鼠标画曲线,

解析:

在工控制软件中,实时曲线的绘制用途非常的广泛,它可以很直观的显示出监控数据的变化值和变化趋势。在VB中实现曲线的绘制有很多种方法,本文介绍一种非常简单的方法来实现实时曲线的绘制。

在VB中实现实时曲线的绘制,要利用VB的PictureBox(图像)控件,和画线函数line(x1,y1)-(x2,y2)。PictureBox控件,可以作为一个“容器”,在它的里面可以包含很多的对象。也可以执行很多VB的内部函数。

要实现实时曲线的绘制,肯定要有外部实时数据的输入,这里假设是有一个数据从计算机的串口输入 定义该数据变量为DataFromCom。实时曲线反映的就是该数据。

打开VB6.0中文版,新建一个项目和窗体,修改窗体的属性,将“Heigh”修改为:8000,“Width”修改为在窗体中放如一个PictureBox控件。然后重新定义PictureBox控件的一些基本属性,在VB中选中PictureBox控件,直接在它的属性框中,修改一些属性参数。“名称”改为Pic。 “AutoRedraw”改为:True。“BackColor”改为:&H***********&(墨绿色背景颜色)。”Heigh”改为:5000。“Width”改为:8000。如图1所示:

然后要重新定义PictureBox控件的坐标系。图像框的默认坐标系,是从左上角开始的,不符合我们的画线要求。修改坐标系的目的是让曲线从图像框的左边正中间,开始画线。修改图像框的坐标系,这里定义一个过程PicScale(),代码如下:

Private Sub PicScale(picX As PictureBox)

picX.Scale (0, PicX.ScaleHeight)-(picX.ScaleWidth, -PicX.ScaleHeight)

End Sub

一般的实时曲线显示的时候在屏幕的正中间有一条基准线,这里也要画出这条基准线,用一个过程PicMidleLine()来实现,代码如下:

Private Sub PicMidleLine( picX As PictureBox)

picX.Line (0, 0)-(picX.ScaleWidth, 0), vbGreen '画出中线

End Sub

要画一条实时曲线,坐标轴的设定很重要,在这里把X轴设定为时间轴,Y轴设定为数据轴。对应X轴我们定义一个时间变量TimeCount,TimeCount会随着时间逐渐递增,每次递增,对应着一个从串口读过来的数据DataFromCom,这样图像框中的(x,y)坐标点实际上就对应着(TimeCount,DataFromCom)如果只是当TimeCount发生变化时就在图像框上画一个点,就只需调用VB中的画像素的函数point(x,y),这里x,y为所画的点的坐标。单这样画出来的是一个个不连续的点。我们想要的是实时的连续的曲线,所以要调用VB中的画线的函数line(x1,y1)-(x2,y2),这里(x1,y1)(x2,y2)为所要画的线的起点和终点的坐标。只要把上次串口读过来的数据(这里把它定义为变量DataFromComLast)和现在串口读过来的数据(DataFromCom)和TimeCount相对应,调用line(x1,y1)-(x2,y2)函数就可以在图像框中画出实时的曲线了。把它写成一个过程如下面的代码:

Private Sub DrawRealLine(picX As PictureBox, TimeCountX As Integer, DataFromComX As Integer, DataFromComLastX As Integer)

If TimeCountX - 1 >0 Then

picX.Line (TimeCountX - 1, DataFromComLastX)-(TimeCountX, DataFromComX), vbWhite

End If

End Sub

有了三个过程就可以在图像框中画出一条实时的曲线了。

DrawRealLine()过程中的picX.Line (TimeCountX - 1, DataFromComLastX)-(TimeCountX, DataFromComX), vbWhite所画线的起始点和结束点都是以像素为单位的,这样以来如果不改变的话,画出来的线将是一个屏幕上像素相连的很密的曲线,通过调整line(x1,y1)-(x2,y2)

中的x的值,就可以画出分布密度不一样的曲线,这里为了在屏幕上能够看到不是很密的曲线我们把x乘以一个系数10,修改为:

picX.Line ((TimeCountX - 1) * 10, DataFromComLastX)-(TimeCountX * 10, DataFromComX), vbWhite

这比较容易在屏幕上看到稀疏的曲线。

由于是仅仅讲解如何画出实时的曲线,读者的计算机上未必有和串口相连的设备,这里用一个定时器控件来模拟从串口读过来的数据。在窗体上放入一个Timer控件,修改Timer控件的属性为:“Enable”该为True,“Interval”改为300。双击Timer控件在它的过程中,添加代码后如下:

Private Sub Timer1_Timer()

DataFromComLast = DataFromCom

Randomize

DataFromCom = 3000 * Rnd

TimeCount = TimeCount + 1

DrawRealLine Pic, TimeCount, DataFromCom, DataFromComLast

End Sub

这样在运行后就可以看到我们想要的实时曲线了,如下图:

图 2

下面是完整的代码:

Option Explicit

Dim DataFromCom As Integer '从串口读过来的实时值

Dim DataFromComLast As Integer '上次的串口值

Dim TimeCount As Integer

Private Sub Form_Load()

PicScale Pic '调整图像框的坐标系

PicMidleLine Pic '在图像框中画一条中线

End Sub

Private Sub PicScale(picX As PictureBox) '调整图像框的坐标系

picX.Scale (0, picX.ScaleHeight)-(picX.ScaleWidth, -picX.ScaleHeight)

End Sub

Private Sub PicMidleLine(picX As PictureBox) '在图像框中画一条中线

picX.Line (0, 0)-(picX.ScaleWidth, 0), vbGreen '画出中线

End Sub

Private Sub DrawRealLine(picX As PictureBox, TimeCountX As Integer, DataFromComX As Integer, DataFromComLastX As Integer)

If TimeCountX - 1 >0 Then

picX.Line ((TimeCountX - 1) * 10, DataFromComLastX)-(TimeCountX * 10, DataFromComX), vbWhite

End If

End Sub

Private Sub Timer1_Timer()

DataFromComLast = DataFromCom

Randomize

DataFromCom = 3000 * Rnd

TimeCount = TimeCount + 1

DrawRealLine Pic, TimeCount, DataFromCom, DataFromComLast '画出实时的曲线

End Sub

在VB中绘制实时曲线是比较难的,一般要应用第三方控件或是Windows API函数来完成,但是如果你对实时曲线的要求不是很高,只要能表示出当前的一般情况的话,我们可以直接应用VB提供给我们的空间来完成.

原则上讲,直接在Form里绘制曲线都是可以的,MSDN上面很多例程就是直接在Form里面绘制图形的,Form作为绘制图形的容器,不过一般应用中Form中不可避免的会有很多其他控件,所以我们选择PictureBox作为绘制曲线的容器.

实时曲线的绘制一般借助于Timer控件来完成,使用Timer控件,定期将串口或是其他仪器中监测到的数据送往PictureBox1,而曲线的绘制一般画成折线图,采用PictureBox1的Line方法绘制.具体实现如下:

1.选择需要显示的窗体Picture1,加入图片框Picture1,根据实际需要设置图片的大小并移到合适的位置,并在图片的外面画好量程----时间坐标系;然后加上Timer控件以及两个CommandButton,界面就基本设置好了.

2.建立坐标系,根据Picture1的大小和高度设置画出坐标系的X轴和Y轴:

Picture1 .ScaleMode = 1 ‘以VB的基本单位作为建立坐标轴以及绘制图形的单位

Picture1.Refresh

Picture1.CurrentX = Picture1.ScaleLeft +100

Picture1.CurrentY = Picture1.ScaleTop

Picture1.Print Picture1.ScaleHeight - 100

Picture1.Line(Picture1.ScaleLeft+100,Picture1.ScaleTop+100)-(Picture1.ScaleLeft+100, Picture1.ScaleHeight - 100)

Picture1.CurrentX = Picture1.ScaleLeft +100

Picture1.CurrentY = Picture1.ScaleHeight

Picture1.Print “(0,0)”

Picture1.Line (Picture1.ScaleLeft + 100, Picture1.ScaleHeight - 100)-(Picture1.ScaleWidth - 100, Picture1.ScaleHeight - 100)

Picture1.CurrentX = Picture1.ScaleWidth

Picture1.CurrentY = Picture1.ScaleHeight

Picture1.Print Picture1.ScaleWidth-100

Picture1.AutoRedraw = True ‘必要时,用存储在内存中的图象进行重绘

3.绘制曲线并保存,我们这里以正弦曲线作为绘制曲线的数据来源,具体应用是可以采用由串口或其他仪器采集得到的数据.首先我们绘制一条中线,然后在Timer控件的Time事件中绘制曲线:

Picture1.Line (Picture1.ScaleLeft, CInt(Picture1.ScaleHeight / 2))-(Picture1.ScaleWidth, CInt(Picture1.ScaleHeight / 2)) ‘绘制中线

Private Sub Timer1_Timer()

Dim y1 As Integer

y1 = CInt(Sin((x - Picture1.Left) / 20 / 180 * pi) * Picture1.ScaleHeight / 2)

y1 = CInt((Picture1.ScaleHeight + 1000) / 2) - y1

Picture1.Line (x, y)-(x + 20, y1)

x = x + 20

y = y1

If x >= Picture1.ScaleWidth Then

SavePicture Picture1.Image, "c:\sin.bmp" ‘保存图画,

如何在vb中绘制多条曲线

Private Sub Form_Load()

MSChart1.chartType = VtChChartType2dLine

Dim arrValues()

ReDim arrValues(1 To 5, 1 To 6)

Dim i As Integer

For i = 1 To 5

arrValues(i, 1) = "t" &i 'x轴

arrValues(i, 2) = 0 + Rnd * 100 '第一条线

arrValues(i, 3) = 0 + Rnd * 100 '第二条线

arrValues(i, 4) = 0 + Rnd * 100 '第三条线

arrValues(i, 5) = 0 + Rnd * 100 '第四条线

arrValues(i, 6) = 0 + Rnd * 100 '第五条线

Next i

MSChart1.ChartData = arrValues

如何在origin中绘制多条曲线

把每条曲线的资料输入book工作表中,A、 B列,C、D列和E、F列分别为三条不同曲线的资料。选中C列,然后右击,选set as下属的X,就成功将C列设为第二条曲线的X轴,类似的把第三条曲线的资料进行相同的处理,这样当每条曲线的X轴资料不一样时也不会影响作图。选中所有资料,点选左下方线条右边的小三角形,在出现的选项中选择line,这样就成功画出了三条不同资料的曲线。双击横座标或者纵座标,出现一个对话方块,选择scale可以对横轴座标的范围以及资料间距进行设定,选择Title and Format可以对图形四个轴以及刻度进行设定。最后,可以点选左上角File,选择Export Graphs,在跳出的视窗中选择储存位置。

怎么在origin中画多条曲线

将不同的资料分别设为的X和Y即可(即X1,Y1,X2,Y2……)。 具体步骤如下: 选中第一个横座标那列数,右键单击——选择set as——选择X,此时这列资料便会被设为X1。选中第一个纵座标,右键单击——选择set as——选择Y,此时这列资料便会被设为Y1。

如何在origin中绘制区分多条曲线

origin绘制多条曲线,如果不同的Y值对应的X值相同的即只有一栏X值,那么只要选中所有的资料,点选选择origin下面的工具栏中的图形型别即可作图。

如果不同的Y值对应的X值不同,即有不同的X值栏,这样只有选中不同X资料栏,右键选择set as:选择X,即可设定不同的X1,X2,X3……,接着同样选择set as:Y,设定不同的Y1,Y2,Y3……,然后选择所有的资料作图即可。

做出的图的图列会自动以曲线颜 *** 分多条曲线。

望采纳,谢谢!

如何在origin中绘制多条不同座标的曲线

将不同的资料分别设为的X和Y即可(即X1,Y1,X2,Y2……)。

具体步骤如下:

选中第一个横座标那列数,右键单击——选择set as——选择X,此时这列资料便会被设为X1。选中第一个纵座标,右键单击——选择set as——选择Y,此时这列资料便会被设为Y1。

选中第二个横座标那列数,同样 *** 作,此时这列资料便会被设为X2。以此类推。

最后将资料全选后作图,就会发现不同横纵座标的资料被做在一张图上了。

望采纳,谢谢

如何在matlab同一个图形上绘制多条曲线

利用hold on命名即可实现在同一图形中绘制多条曲线或利用绘图命令一次绘制多条曲线。

hold on就是将figure中的图形储存,之后再通过绘图命令绘制下一条曲线,使多条曲线同时显示在一个图形之中。

具体实现方法可以参考如下程式段:

1

2

3

4

5

6

7

t = -5 : 0.01 : 5

x = sin(t)

y = cos(t)

plot(t, x)绘制正弦曲线

hold on将正弦曲线保持在图形中

plot(t, y)绘制余弦曲线,完成后图形中就会同时显示正弦曲线和余弦曲线

plot(t,x, t,y)同时绘制正弦曲线和余弦曲线,该方法也是在图形中同时显示正弦曲线和余弦曲线

如何在excel中绘制曲线

开启excel--检视--工具栏--绘图--下面的自选图形--曲线--根据需要自行调整

excel是日常办公必不可少的工具之一,其有很强大的功能。今天给大家分享一下怎样使用excel绘制曲线图。这个功能能够根据资料绘制出不同型别的图,如果对曲线图要求不高可以用excel代替matlab来画资料分析曲线图。(注意曲线是对比用的)

选中资料区域-->“插入”选单-->“图表”-->“图表型别”中选择“XY散点图”-->“子图表型别”中选择“无资料点平滑线散点图”-->点选“完成”

您也可以向我们团队发出请求,会有更专业的人来为您解答!

private Type POINTAPI

x As Long

y As Long

End Type

'描绘一条或多条贝塞尔(Bezier)曲线。PolyBezierTo用于将当前画笔位置设为前一条曲线的终点

private Declare Function PolyBezier Lib "gdi32" _

                Alias "PolyBezier" (ByVal hdc As Long, _

                                    lppt As POINTAPI, _

                                    ByVal cPoints As Long) As Long

                                    

Private Declare Function PolyBezierTo Lib "gdi32.dll" (ByVal hdc As Long, lppt As POINTAPI, ByVal cCount As Long) As Long

Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As Any) As Long

Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Private Declare Function PolyPolygon Lib "gdi32.dll" (ByVal hdc As Long, lpPoint As POINTAPI, lpPolyCounts As Long, ByVal nCount As Long) As Long

查下以上API就可以画任意曲线了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8064601.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存