分類: 電腦/網絡 程序設計 其他編程語言
創新互聯建站主營沁陽網站建設的網絡公司,主營網站建設方案,APP應用開發,沁陽h5成都微信小程序搭建,沁陽網站營銷推廣歡迎沁陽等地區企業咨詢
問題描述:
如何用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點虐 連續繪制曲線圖不消物畝失怎么辦?b點虐 連續繪制曲線圖不消失的解決辦法如下:
1、首先必須罩爛森創建bitmap,關聯到picturebox1.image上。
2、再在歷腔picturebox1.image上創建Graphics,再進行作圖。即可顯示線圖。
拖一個PictureBox1控件 創建一個Paint事件。在事件中加入 Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint ' Create pens. Dim redPen As New Pen(Color.Red, 3) Dim greenPen As New Pen(Color.Green, 3) ' Create points that define curve. Dim point1 As New Point(50, 50) Dim point2 As New Point(100, 25) Dim point3 As New Point(200, 5) Dim point4 As New Point(250, 50) Dim point5 As New Point(300, 100) Dim point6 As New Point(350, 200) Dim point7 As New Point(250, 250) Dim curvePoints As Point() = {point1, point2, point3, point4, _ point5, point6, point7} ' Draw lines between original points to screen. e.Graphics.DrawLines(redPen, curvePoints) ' Draw curve to screen. e.Graphics.DrawCurve(greenPen, curvePoints) End Sub 得余冊到數據后,改point的數據。漏頌然后返毀鄭PictureBox1.Refresh()就行了
新聞標題:vb點虐
實時繪制曲線的簡單介紹
當前網址:http://vcdvsql.cn/article26/ddpcgjg.html
成都網站建設公司_創新互聯,為您提供建站公司、Google、關鍵詞優化、自適應網站、企業建站、網站策劃
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯