可以把所有畫的線都保存在一個列表中,畫的時候全部畫出即可。如下:
創新互聯堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站建設、成都網站制作、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的武平網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!
Public?Class?Form1
Class?Line? ? ? '直線類
? Public?Point1,?Point2?As?Point? ? ?'成員,直線的兩個端點
? Sub?New(p1?As?Point,?p2?As?Point)? ?'構造方法
? ? ? Point1?=?p1
? ? ? Point2?=?p2
? End?Sub
? Public?Sub?Draw(g?As?Graphics)? ? ? '繪制方法
? ? ? g.DrawLine(Pens.Black,?Point1,?Point2)
? End?Sub
End?Class
Private?Lines?As?New?List(Of?Line)? ? ? '列表用于保存所有畫下的直線
Private?Sub?Form1_Load(sender?As?Object,?e?As?EventArgs)?Handles?MyBase.Load
? BackColor?=?Color.White
? DoubleBuffered?=?True? ? ? ?'開啟雙緩沖可有效避免閃爍
End?Sub
Private?Sub?Form1_MouseDown(sender?As?Object,?e?As?MouseEventArgs)?Handles?Me.MouseDown
? Lines.Add(New?Line(e.Location,?e.Location))? ? ?'在直線列表中添加直線
End?Sub
Private?Sub?Form1_MouseMove(sender?As?Object,?e?As?MouseEventArgs)?Handles?Me.MouseMove
? If?e.Button??Windows.Forms.MouseButtons.Left?Then?Return?'左鍵未按下
? '鼠標拖動時改變列表最后一條直線(也即當前直線的第二個端點)
? Lines(Lines.Count?-?1).Point2?=?e.Location
? Refresh()? ? ? ?'刷新窗體
End?Sub
'在Form的Paint事件中繪制所有直線,每次Form1重繪時都會觸發Paint事件
'PS:?也可以通過重寫OnPaint方法來達到類似的效果
Private?Sub?Form1_Paint(sender?As?Object,?e?As?PaintEventArgs)?Handles?Me.Paint
? e.Graphics.SmoothingMode?=?Drawing2D.SmoothingMode.AntiAlias? ? '開啟抗鋸齒
? For?Each?l?In?Lines? ? ?'遍歷所有直線
? ? ? l.Draw(e.Graphics)? '調用繪制方法,傳入的參數可以理解為畫布
? Next
End?Sub
End?Class
運行效果:
Dim g As Graphics = PictureBox1.CreateGraphics
g.TranslateTransform(2, 2) ‘定義原點坐標
g.ScaleTransform(1, -1) ’X軸不變,反轉Y軸
以PictureBox1中(2,2)點為新的原點(0,0)
向右為X軸正方向 向上為Y軸正方向
多線程一般是不推薦用的,因為線程之間如果有共享資源的話會引起競爭,需要加鎖處理;而且線程間沒有時序關系,所以你在調試中可能會出現異步處理結束順序與開始處理順序不一致的情況(我在調試中已經發現該問題)。
針對你提出的這個問題,采用了多線程處理,利用的是BackgroundWorker也就是異步處理控件進行了處理。
代碼已經經過調試通過。歡迎交流,如有問題,留下QQ或其他聯系方式。
代碼如下,并附程序截圖。
‘---------------------------------------------------
Imports?System.ComponentModel?'導入異步控件命名空間
Public?Class?Form1
Private?howmany?As?Integer?=?10
Private?AnalysisNumber(0?To?howmany?-?1)?As?BackgroundWorker
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
ListBox1.Items.Clear()
creatNewBackgroundWorker()
addHandle()
startWork()
End?Sub
Private?Sub?creatNewBackgroundWorker()
For?i?As?Integer?=?0?To?AnalysisNumber.Length?-?1
AnalysisNumber(i)?=?New?BackgroundWorker
Next
End?Sub
Private?Sub?addHandle()
For?i?As?Integer?=?0?To?AnalysisNumber.Length?-?1
AddHandler?AnalysisNumber(i).DoWork,?AddressOf?AnalysisNumber_DoWork
AddHandler?AnalysisNumber(i).RunWorkerCompleted,?AddressOf?AnalysisNumber_RunWorkerCompleted
Next
End?Sub
Private?Sub?startWork()
For?i?As?Integer?=?0?To?9
Dim?temp(0?To?9)?As?Integer
For?j?As?Integer?=?1?To?10
temp(j?-?1)?=?10?*?i?+?j
Next
AnalysisNumber(i).RunWorkerAsync(temp)
Next
End?Sub
Private?Sub?AnalysisNumber_DoWork(ByVal?sender?As?Object,?ByVal?e?As?System.ComponentModel.DoWorkEventArgs)
Dim?data?As?Integer()
data?=?CType(e.Argument,?Integer())
Dim?temp?As?Integer
For?i?As?Integer?=?0?To?data.Length?-?1
temp?=?data(i)
data(i)?=?temp?*?temp
Next
e.Result?=?data
End?Sub
Private?Sub?AnalysisNumber_RunWorkerCompleted(ByVal?sender?As?Object,?ByVal?e?As?System.ComponentModel.RunWorkerCompletedEventArgs)
Dim?data?As?Integer()
data?=?CType(e.Result,?Integer())
For?i?As?Integer?=?0?To?data.Length?-?1
ListBox1.Items.Add(data(i))
Next
End?Sub
End?Class
VB.NET是基于.NET框架的完全對向對象的編程語言,而vb 6.0只是半面向對象的語言,使用vb.net可以編制出功能更加強大的windows程序。現在,我們把vb.net和vb 6.0做一下比較,看看vb.net對比vb 6.0有著什么樣的特性和優點。 1.在vb 6.0中,創建對象的時候,需要等這個對象創建完畢后,再另外調用一個獨立的方法對其進行初始化。在vb.net中, 可以利用構造函數為對象賦初值,這樣就不需要進行煩瑣的調用賦初值了。構造函數的使用,簡化了編碼的過程和出錯的機會。 2.vb.net編寫線程的能力比vb 6.0有很大的增強。 3.在vb 6.0中,需要首先聲明一個變量,然后才能對其賦值,這樣就需要寫兩行代碼。在vb.net中,可以 使用初始化函數將這兩個步驟合并在一行代碼中完成,這個似乎微小的改進,提供了更少、更簡單、更易于維護的代碼。 4.vb.net基于.NET框架,開發者可以快速的可視化開發網絡應用程序、網絡服務、Windows應用程序和服務器端組件。 5.因為vb.net是基于.NET框架的,可以與其它.NET語言協同工作。 6.在vb.net中,通過Web窗體及ADO.NET,開發者可以快速開發可擴展的Web站點。 如果你能進一步學習vb.net,你會發現更多的新特性和優點
要么重寫這個控件的 OnPaint 事件,判斷 BorderStyle 屬性為 FixedSingle 的時候自繪其他顏色。
要么不重寫,把 BorderStyle 設為 None,直接在這個控件的 Paint 事件里自繪邊框,例如:
Private?Sub?Label1_Paint(sender?As?Object,?e?As?PaintEventArgs)?Handles?Label1.Paint
e.Graphics.DrawRectangle(Pens.Red,?New?Rectangle(Label1.DisplayRectangle.X,?Label1.DisplayRectangle.Y,?Label1.DisplayRectangle.Width?-?1,?Label1.DisplayRectangle.Height?-?1))
End?Sub
運行效果:
Dim b As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim g As Graphics = Graphics.FromImage(b)
g.Clear(Color.White)
Dim p As New Pen(Color.Black)
p.EndCap = Drawing2D.LineCap.ArrowAnchor
g.DrawLine(p, 30, PictureBox1.Height - 30, 30, 30)
g.DrawLine(p, 30, PictureBox1.Height - 30, PictureBox1.Width - 30, PictureBox1.Height - 30)
Dim i As Integer
Dim bs As New SolidBrush(Color.Green)
Dim po As New Point
po.X = 0
po.Y = PictureBox1.Height - 35
For i = 700 To 1000 Step 50
g.DrawString(i, Me.Font, bs, po.X, po.Y)
g.DrawLine(p, po.X + 28, po.Y + 5, po.X + 30, po.Y + 5)
po.Y -= (PictureBox1.Height - 100) / 6
Next
po.X = 30
po.Y = PictureBox1.Height - 30
For i = 0 To 40 Step 5
g.DrawString(i, Me.Font, bs, po.X, po.Y + 5)
g.DrawLine(p, po.X, po.Y + 2, po.X, po.Y)
po.X += (PictureBox1.Width - 100) / 8
Next
PictureBox1.Image = b
分享名稱:vb.net線帽的簡單介紹
網頁地址:http://vcdvsql.cn/article8/hejgip.html
成都網站建設公司_創新互聯,為您提供網站設計公司、自適應網站、軟件開發、微信公眾號、電子商務、企業建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯