这是画实时曲线的一个例子,你可以参考一下。可以选择画6条曲线和一条曲线,要引用:'实时曲线左移函数 Public Declare Function BitBlt Lib "GDI32" (ByVal hDestDC As Long, ByVal x As _ Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal _ hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal DrawStyle As _ Long) As Long'实时曲线 Public Sub RTCurveDraw(picDraw As PictureBox, crvType As String, cYmax As Integer, cYmin As Integer, crvData1 As Double, crvData2 As Double, crvData3 As Double, crvData4 As Double, crvData5 As Double, crvData6 As Double) Dim ypixels, xpixels, i% Dim ShowMode As Long, ii As Long, tm As String, hBmp As Long Dim a(1 To 6) As Double a(1) = crvData1 a(2) = crvData2 a(3) = crvData3 a(4) = crvData4 a(5) = crvData5 a(6) = crvData6
Dim t As Integer t = Minute(Now()) nMinutes = t If nMinutes > nTempMinutes Then picDraw.CurrentX = picDraw.ScaleWidth - 19 picDraw.CurrentY = picDraw.ScaleHeight - 11 picDraw.Print nMinutes End If nTempMinutes = nMinutes
picDraw.ScaleMode = vbPixels ypixels = picDraw.ScaleHeight - 1 xpixels = picDraw.ScaleWidth - 1 Select Case crvType Case "Temp" For i = 1 To 6 cY1(i) = Int(ypixels - (a(i) - cYmin) / (cYmax - cYmin) * ypixels) If cY1(i) = cY0(i) Then cY1(i) = cY1(i) + 1 Next picDraw.Line (xpixels - 1, cY0(1))-(xpixels - 1, cY1(1)), vbRed picDraw.Line (xpixels - 1, cY0(2))-(xpixels - 1, cY1(2)), &H404080 picDraw.Line (xpixels - 1, cY0(3))-(xpixels - 1, cY1(3)), vbGreen picDraw.Line (xpixels - 1, cY0(4))-(xpixels - 1, cY1(4)), vbBlack picDraw.Line (xpixels - 1, cY0(5))-(xpixels - 1, cY1(5)), vbBlue picDraw.Line (xpixels - 1, cY0(6))-(xpixels - 1, cY1(6)), &HFF00FF For i = 1 To 6 cY0(i) = cY1(i) Next
我从网上找了一个例子,不懂,向大家请教:[实时曲线] 实时曲线反映的是现场数据的实时性和当前趋势,因此在实现时需显示曲线的动态变化,参考DCS,当前点在曲线的最右端显示,而整个曲线动态地向左移动。具体实现如下: 1、选择需要显示的窗体Form1,加入图片框Picture1,根据实际需要设置图片的大小并移到合适的位置,并在图片的外面画好量程----时间坐标系; 2、 在全局模块中定义位块传输API函数BitBlt( )和全局变量: Declare Function BitBlt Lib "GDI32" (ByVal hDestDC AS Long,ByVal X As Long,ByVal Y As Long,ByVal nWidth As Long,ByVal nHeight As Long,ByVal hSrcDC As Long,ByVal xSrc As Long,ByVal ySrc As Long,ByVal DrawStyleAs Long) As Long Gobal S As Long `量程 Gobal L As Long `上一次的纵坐标值 Gobal T As Integer `上一次时间值(分) 3、 Private Sub Form1_Load() Picture1.AutoRedraw = False `曲线不重画 Picture1.ScaleMode = 3 `以象素方式(Pixel) L = -1 `设置初值 S = 400 T = -1 End Sub 4、根据现场数据采集的采样频率,设置定时器Timer1的定时值,曲线移动就 在 Timer1实现: Private Sub Timer1_Time() Dim w As Long, h As Long, y1 As Long, Data As Long Dim hBmp As hDC, ShowMode As Long, ii As Long, t1 As Integer w = Picture1.Width h = Picture1.Height hBmp = Picture1.hDC ShowMode = &HCC0020 `ROP模式(复制) Data = Get_RealDatabase( ) `从实时数据库取当前监控值 y1 = (S - Data) / S * h `根据量程转变成具体坐标 ii = BitBlt(hBmp,0,0,w-1,h,hBmp,1,0,ShowMode) `整个曲线右移一个像素点 Picture1.Line (w - 1,y) - (w,y1) , RGB(0,255,0) y = y1 t1 = Val(Mid$(Time$,3,2)) If T < > t1 Then `在曲线下方显示时间(用分表示) Picture1.CurrentX = w - 16 Picture1.CurrentY = h - 8 Picture1.Print Mid$(Time$,1,5) T = t1 End If End Sub ---------------------------我按照步骤,打开VB6.0,然后在Form1里加入图片框Picture1,然后菜单栏里:工程-->添加模块,然后写上下面代码: Declare Function BitBlt Lib "GDI32" (ByVal hDestDC AS Long,ByVal X As Long,ByVal Y As Long,ByVal nWidth As Long,ByVal nHeight As Long,ByVal hSrcDC As Long,ByVal xSrc As Long,ByVal ySrc As Long,ByVal DrawStyleAs Long) As Long Gobal S As Long Gobal L As Long Gobal T As Integer 为什么出现: 编译错误:缺少分割符或) 编译错误:缺少语句结束是哪儿的问题啊,谢谢了啊
Declare Function BitBlt Lib "GDI32" (ByVal hDestDC AS Long,ByVal X As Long,ByVal Y As g,ByVal nWidth As Long,ByVal nHeight As Long,ByVal hSrcDC As Long,ByVal xSrc As Long,ByVal ySrc As Long,ByVal DrawStyleAs Long) As Long你把这3行合成1行就没有错了,换行的时候要用 _ 加上 & ,不然就不能和下面的语句合起来了
Winters_lee非常非常感谢你!我水平实在太差,当然想让你们这些高手帮忙,可没有RMB啊。这两天拿着2本VB书,但翻完再来看这题,还是盲目。再来麻烦不好意思,如果不想回答,也可以给我指点一下,主要重点看看哪一部分。非常感谢你!!我按照你说的那个方法一步一步来。1.打开VB6.0中文版,新建一工程,拖入PictureBox控件,调整大小,(这里想问一下:怎样画X、Y轴啊)2、打开 工程-->添加模块,输入: Public Declare Function BitBlt Lib "GDI32 " (ByVal hDestDC As Long, ByVal x As _ Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal _ hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal DrawStyle As _ Long) As Long Public Sub RTCurveDraw(picDraw As PictureBox, crvType As String, cYmax As Integer, cYmin As Integer, crvData1 As Double, crvData2 As Double, crvData3 As Double, crvData4 As Double, crvData5 As Double, crvData6 As Double)
Dim ypixels, xpixels, i% Dim ShowMode As Long, ii As Long, tm As String, hBmp As Long Dim a(1 To 6) As Double a(1) = crvData1 a(2) = crvData2 a(3) = crvData3 a(4) = crvData4 a(5) = crvData5 a(6) = crvData6
Dim t As Integer t = Minute(Now()) nMinutes = t If nMinutes > nTempMinutes Then picDraw.CurrentX = picDraw.ScaleWidth - 19 picDraw.CurrentY = picDraw.ScaleHeight - 11 picDraw.Print nMinutes End If nTempMinutes = nMinutes
Select Case crvType Case "Temp " For i = 1 To 6 cY1(i) = Int(ypixels - (a(i) - cYmin) / (cYmax - cYmin) * ypixels) If cY1(i) = cY0(i) Then cY1(i) = cY1(i) + 1 Next picDraw.Line (xpixels - 1, cY0(1))-(xpixels - 1, cY1(1)), vbRed picDraw.Line (xpixels - 1, cY0(2))-(xpixels - 1, cY1(2)), &H404080 picDraw.Line (xpixels - 1, cY0(3))-(xpixels - 1, cY1(3)), vbGreen picDraw.Line (xpixels - 1, cY0(4))-(xpixels - 1, cY1(4)), vbBlack picDraw.Line (xpixels - 1, cY0(5))-(xpixels - 1, cY1(5)), vbBlue picDraw.Line (xpixels - 1, cY0(6))-(xpixels - 1, cY1(6)), &HFF00FF For i = 1 To 6 cY0(i) = cY1(i) Next
Case "Ma " cY1(1) = Int(ypixels - (a(1) - cYmin) / (cYmax - cYmin) * ypixels) If cY1(1) = cY0(1) Then cY1(1) = cY1(1) + 1 picDraw.Line (xpixels - 1, cY0(1))-(xpixels - 1, cY1(1)), vbRed cY0(1) = cY1(1)
End Select
End Sub 然后再怎么做啊?
ByVal DrawStyleAs Long少一个空格ByVal DrawStyle As Long
把我前两天做的给你看看吧,但是没有导到access中,至于数据的获得可以用mscomm控件就行拉!!我是通过timer控件实时形成的数据Option Explicit Public iAAlert As Integer '报警值 Const HY = 4000 'y轴的最大表示值 Const LX = 30000 'x轴的最大位置Const iV = 200 '时间间隔 Dim i As Long '临时变量 Dim iD As Long 'x的坐标 Dim iA As Long 'y的坐标 Dim Inum As Long '实时y的坐标值Private Sub Command1_Click() Form2.Show End SubPrivate Sub Form_Load()Dim sA As String '文件中的值 Me.Move (Screen.Width - Mainform.Width) \ 2, (Screen.Height - Mainform.Width) \ 2 '调整picture的位置 Picture1.ScaleMode = 3 Open App.Path & "\date.txt" For Input As #1 Input #1, sA Close #1iAAlert = sA
'初始化picture的位置 Picture1.Top = 0 Picture1.Left = 0 Picture1.Width = Mainform.Width Picture1.Scale (0, HY)-(LX, 0) '建立自己的作标系统'初始化报警线的位置 With Line1 .X1 = 0 .X2 = Picture1.ScaleWidth .Y1 = iAAlert .Y2 = iAAlert End With End Sub Private Sub Timer1_Timer()i = iD + iVWith Picture1 If iD > .ScaleWidth * 0.98 Then
.Left = .Left - iV .Width = .Width + iV Line1.X1 = 0 Line1.X2 = .ScaleWidth
Public Declare Function BitBlt Lib "GDI32" (ByVal hDestDC As Long, ByVal x As _
Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal _
hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal DrawStyle As _
Long) As Long'实时曲线
Public Sub RTCurveDraw(picDraw As PictureBox, crvType As String, cYmax As Integer, cYmin As Integer, crvData1 As Double, crvData2 As Double, crvData3 As Double, crvData4 As Double, crvData5 As Double, crvData6 As Double) Dim ypixels, xpixels, i%
Dim ShowMode As Long, ii As Long, tm As String, hBmp As Long
Dim a(1 To 6) As Double
a(1) = crvData1
a(2) = crvData2
a(3) = crvData3
a(4) = crvData4
a(5) = crvData5
a(6) = crvData6
picDraw.DrawWidth = 1
hBmp = picDraw.hDC
ShowMode = &HCC0020
ii = BitBlt(hBmp, 0, 0, picDraw.ScaleWidth - 1, picDraw.ScaleHeight - 1, hBmp, 1, 0, ShowMode)
Dim t As Integer
t = Minute(Now())
nMinutes = t
If nMinutes > nTempMinutes Then
picDraw.CurrentX = picDraw.ScaleWidth - 19
picDraw.CurrentY = picDraw.ScaleHeight - 11
picDraw.Print nMinutes
End If
nTempMinutes = nMinutes
picDraw.ScaleMode = vbPixels
ypixels = picDraw.ScaleHeight - 1
xpixels = picDraw.ScaleWidth - 1 Select Case crvType
Case "Temp"
For i = 1 To 6
cY1(i) = Int(ypixels - (a(i) - cYmin) / (cYmax - cYmin) * ypixels)
If cY1(i) = cY0(i) Then cY1(i) = cY1(i) + 1
Next
picDraw.Line (xpixels - 1, cY0(1))-(xpixels - 1, cY1(1)), vbRed
picDraw.Line (xpixels - 1, cY0(2))-(xpixels - 1, cY1(2)), &H404080
picDraw.Line (xpixels - 1, cY0(3))-(xpixels - 1, cY1(3)), vbGreen
picDraw.Line (xpixels - 1, cY0(4))-(xpixels - 1, cY1(4)), vbBlack
picDraw.Line (xpixels - 1, cY0(5))-(xpixels - 1, cY1(5)), vbBlue
picDraw.Line (xpixels - 1, cY0(6))-(xpixels - 1, cY1(6)), &HFF00FF
For i = 1 To 6
cY0(i) = cY1(i)
Next
Case "Ma"
cY1(1) = Int(ypixels - (a(1) - cYmin) / (cYmax - cYmin) * ypixels)
If cY1(1) = cY0(1) Then cY1(1) = cY1(1) + 1
picDraw.Line (xpixels - 1, cY0(1))-(xpixels - 1, cY1(1)), vbRed
cY0(1) = cY1(1)
End Select
End Sub
但我VB的确是很差看不太懂,但这个太急,现在从头系统学又来不及,所以还有详细点的吗?譬如从开始的建坐标系开始....
先谢谢了啊!!!~~
实时曲线反映的是现场数据的实时性和当前趋势,因此在实现时需显示曲线的动态变化,参考DCS,当前点在曲线的最右端显示,而整个曲线动态地向左移动。具体实现如下:
1、选择需要显示的窗体Form1,加入图片框Picture1,根据实际需要设置图片的大小并移到合适的位置,并在图片的外面画好量程----时间坐标系;
2、 在全局模块中定义位块传输API函数BitBlt( )和全局变量:
Declare Function BitBlt Lib "GDI32" (ByVal hDestDC AS Long,ByVal X As Long,ByVal Y As Long,ByVal nWidth As Long,ByVal nHeight As Long,ByVal hSrcDC As Long,ByVal xSrc As Long,ByVal ySrc As Long,ByVal DrawStyleAs Long) As Long
Gobal S As Long `量程
Gobal L As Long `上一次的纵坐标值
Gobal T As Integer `上一次时间值(分)
3、 Private Sub Form1_Load()
Picture1.AutoRedraw = False `曲线不重画
Picture1.ScaleMode = 3 `以象素方式(Pixel)
L = -1 `设置初值
S = 400
T = -1
End Sub
4、根据现场数据采集的采样频率,设置定时器Timer1的定时值,曲线移动就
在
Timer1实现:
Private Sub Timer1_Time()
Dim w As Long, h As Long, y1 As Long, Data As Long
Dim hBmp As hDC, ShowMode As Long, ii As Long, t1 As Integer
w = Picture1.Width
h = Picture1.Height
hBmp = Picture1.hDC
ShowMode = &HCC0020 `ROP模式(复制)
Data = Get_RealDatabase( ) `从实时数据库取当前监控值
y1 = (S - Data) / S * h `根据量程转变成具体坐标
ii = BitBlt(hBmp,0,0,w-1,h,hBmp,1,0,ShowMode) `整个曲线右移一个像素点
Picture1.Line (w - 1,y) - (w,y1) , RGB(0,255,0)
y = y1
t1 = Val(Mid$(Time$,3,2))
If T < > t1 Then `在曲线下方显示时间(用分表示)
Picture1.CurrentX = w - 16
Picture1.CurrentY = h - 8
Picture1.Print Mid$(Time$,1,5)
T = t1
End If
End Sub
---------------------------我按照步骤,打开VB6.0,然后在Form1里加入图片框Picture1,然后菜单栏里:工程-->添加模块,然后写上下面代码:
Declare Function BitBlt Lib "GDI32" (ByVal hDestDC AS Long,ByVal X As Long,ByVal Y As Long,ByVal nWidth As Long,ByVal nHeight As Long,ByVal hSrcDC As Long,ByVal xSrc As Long,ByVal ySrc As Long,ByVal DrawStyleAs Long) As Long
Gobal S As Long
Gobal L As Long Gobal T As Integer 为什么出现: 编译错误:缺少分割符或) 编译错误:缺少语句结束是哪儿的问题啊,谢谢了啊
Public Declare Function BitBlt Lib "GDI32 " (ByVal hDestDC As Long, ByVal x As _
Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal _
hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal DrawStyle As _
Long) As Long
Public Sub RTCurveDraw(picDraw As PictureBox, crvType As String, cYmax As Integer, cYmin As Integer, crvData1 As Double, crvData2 As Double, crvData3 As Double, crvData4 As Double, crvData5 As Double, crvData6 As Double)
Dim ypixels, xpixels, i%
Dim ShowMode As Long, ii As Long, tm As String, hBmp As Long
Dim a(1 To 6) As Double
a(1) = crvData1
a(2) = crvData2
a(3) = crvData3
a(4) = crvData4
a(5) = crvData5
a(6) = crvData6
picDraw.DrawWidth = 1
hBmp = picDraw.hDC
ShowMode = &HCC0020
ii = BitBlt(hBmp, 0, 0, picDraw.ScaleWidth - 1, picDraw.ScaleHeight - 1, hBmp, 1, 0, ShowMode)
Dim t As Integer
t = Minute(Now())
nMinutes = t
If nMinutes > nTempMinutes Then
picDraw.CurrentX = picDraw.ScaleWidth - 19
picDraw.CurrentY = picDraw.ScaleHeight - 11
picDraw.Print nMinutes
End If
nTempMinutes = nMinutes
picDraw.ScaleMode = vbPixels
ypixels = picDraw.ScaleHeight - 1
xpixels = picDraw.ScaleWidth - 1
Select Case crvType
Case "Temp "
For i = 1 To 6
cY1(i) = Int(ypixels - (a(i) - cYmin) / (cYmax - cYmin) * ypixels)
If cY1(i) = cY0(i) Then cY1(i) = cY1(i) + 1
Next
picDraw.Line (xpixels - 1, cY0(1))-(xpixels - 1, cY1(1)), vbRed
picDraw.Line (xpixels - 1, cY0(2))-(xpixels - 1, cY1(2)), &H404080
picDraw.Line (xpixels - 1, cY0(3))-(xpixels - 1, cY1(3)), vbGreen
picDraw.Line (xpixels - 1, cY0(4))-(xpixels - 1, cY1(4)), vbBlack
picDraw.Line (xpixels - 1, cY0(5))-(xpixels - 1, cY1(5)), vbBlue
picDraw.Line (xpixels - 1, cY0(6))-(xpixels - 1, cY1(6)), &HFF00FF
For i = 1 To 6
cY0(i) = cY1(i)
Next
Case "Ma "
cY1(1) = Int(ypixels - (a(1) - cYmin) / (cYmax - cYmin) * ypixels)
If cY1(1) = cY0(1) Then cY1(1) = cY1(1) + 1
picDraw.Line (xpixels - 1, cY0(1))-(xpixels - 1, cY1(1)), vbRed
cY0(1) = cY1(1)
End Select
End Sub 然后再怎么做啊?
Public iAAlert As Integer '报警值
Const HY = 4000 'y轴的最大表示值
Const LX = 30000 'x轴的最大位置Const iV = 200 '时间间隔
Dim i As Long '临时变量
Dim iD As Long 'x的坐标
Dim iA As Long 'y的坐标
Dim Inum As Long '实时y的坐标值Private Sub Command1_Click()
Form2.Show
End SubPrivate Sub Form_Load()Dim sA As String '文件中的值
Me.Move (Screen.Width - Mainform.Width) \ 2, (Screen.Height - Mainform.Width) \ 2 '调整picture的位置
Picture1.ScaleMode = 3
Open App.Path & "\date.txt" For Input As #1
Input #1, sA
Close #1iAAlert = sA
'初始化picture的位置
Picture1.Top = 0
Picture1.Left = 0
Picture1.Width = Mainform.Width
Picture1.Scale (0, HY)-(LX, 0) '建立自己的作标系统'初始化报警线的位置
With Line1
.X1 = 0
.X2 = Picture1.ScaleWidth
.Y1 = iAAlert
.Y2 = iAAlert
End With
End Sub
Private Sub Timer1_Timer()i = iD + iVWith Picture1 If iD > .ScaleWidth * 0.98 Then
.Left = .Left - iV
.Width = .Width + iV
Line1.X1 = 0
Line1.X2 = .ScaleWidth
End If
Randomize
Inum = Int(3000 * Rnd) + 100 '产生一个界于100和4000之间的随机数
If Inum > iAAlert Then
Image1.Picture = alert.Picture
Else
Image1.Picture = ok.Picture
End If
Picture1.Line (iD, iA)-(i, Inum)
iA = Inum
If .Width > Me.ScaleWidth * 2 Then '数据清零,防止溢出
.Width = Me.ScaleWidth
Line1.X1 = 0
Line1.X2 = .ScaleWidth
.Left = 0
i = 0
End If
End With
iD = iEnd Sub