Visual Basic 6.0 使用者可用的圖形
更新:2007 年 11 月
在 Visual Basic 6.0 中是使用許多圖形方法和屬性 (Property),在 Form 上或 PictureBox 控制項上繪圖。Visual Basic 6.0 中的圖形是以 Windows 繪圖裝置介面 (Graphics Device Interface,GDI) API 為基礎。
在 Visual Basic 2008 中,圖形是由封裝 GDI+ API 的 System.Drawing 命名空間 (Namespace) 所提供。GDI+ 是根據 Visual Basic 6.0 的繪圖功能來擴充,但方法並不相容。
概念上的差異
在 Visual Basic 6.0 中,圖形方法只適用於 Form 物件和 PictureBox 控制項。
在 Visual Basic 2008 中,圖形方法適用於表單,外加任何支援 Paint 事件的控制項,包括 PictureBox、Panel 和 GroupBox 控制項。此外,圖形方法適用於任何支援 OwnerDraw 屬性的控制項,包括 ListView、TreeView 和 Button 控制項。
AutoRedraw 屬性
在 Visual Basic 6.0 中,圖形方法可以從任何事件程序呼叫。從 Paint 事件以外的事件呼叫圖形方法時,會使用 AutoRedraw 屬性來保存 (Persist) 圖形。
在 Visual Basic 2008 中,圖形方法則只能從 Paint 事件程序呼叫,或在某些由擁有者繪製的控制項的情況下,從各種 Draw 事件程序 (DrawItem、DrawSubItem 等) 呼叫。因為 Paint 和 Draw 事件會自動保存圖形,所以不再支援也不需要 AutoRedraw 屬性。
ClipControls 屬性
在 Visual Basic 6.0 中,ClipControls 屬性可用來控制表單或控制項的繪製。設定為 True 時,理論上只會重新繪製新公開 (Expose) 的區域,進而改善效能。
Visual Basic 2008 中沒有 ClipControls 屬性的對等用法。GDI+ 中的效能增強功能和最新的視訊卡使此屬性變得不需要。
DrawMode 屬性
在 Visual Basic 6.0 中,在某個圖樣上繪製另一個圖樣時,DrawMode 屬性會控制圖形物件 (Graphic Object) 的色彩。這個屬性只影響單色或低解析度的顯示器 (256 色或更少)。
Visual Basic 2008 中沒有 DrawMode 屬性的對等用法。目前的顯示器不再需要此屬性。
DrawStyle 屬性
在 Visual Basic 6.0 中,DrawStyle 屬性會使用 Line 方法控制所繪製的線條外觀。如果 DrawWidth 屬性設定為大於 1 的值,DrawStyle 屬性將沒有效果,而且線條將一律為實線。
在 Visual Basic 2008 中,線條外觀是由設定其中一個 DrawLine 方法所使用之 System.Drawing.Pen 類別的 DashStyle 屬性來控制。線條寬度對於這個屬性沒有任何作用。
DrawWidth 屬性
在 Visual Basic 6.0 中,DrawWidth 屬性會決定線條粗細 (以像素為單位),通常在執行圖形方法之前就必須設定 DrawWidth 屬性。
在 Visual Basic 2008 中,System.Drawing.Pen 控制項的 Pen.Width 屬性會決定線條粗細。您可以在建立 Pen 時,將 Width 屬性設定為參數,或在建立 Pen 之後設定 Pen.Width。如果未指定 Pen.Width 屬性,則預設值為 1 個像素。
Image 屬性
在 Visual Basic 6.0 中,表單或 PictureBox 控制項的 Image 屬性會傳回點陣圖的控制代碼,而控制代碼可以指定給 Picture 屬性,或當做值傳遞至 Windows API 呼叫。
在 Visual Basic 2008 中,點陣圖不再具有控制代碼。實質點陣圖本身會當做型別為 Bitmap 的物件傳遞。Bitmap 控制項可以指定給 PictureBox 控制項的 Image 屬性,但不可傳遞至 Windows API 呼叫。
Line 方法
在 Visual Basic 6.0 中,Line 方法可用來繪製矩形,其方式為指定左上方和較低的座標,並使用選擇性 (Optional) 引數 B。FillColor 屬性可用來以純色填滿矩形,而 FillStyle 屬性則以斜紋圖樣填滿矩形。
在 Visual Basic 2008 中,DrawRectangles 方法可用來繪製矩形的框線,而 FillRectangle 方法可用來填滿該矩形。FillRectangle 會將 Brush 物件當做參數使用。SolidBrush 會取代 FillColor 屬性,而 HatchBrush 類別的成員則會取代 FillStyle 屬性。
Point 方法
在 Visual Basic 6.0 中,表單或 PictureBox 控制項的 Point 方法可用來為指定點的像素傳回色彩值。雖然 Point 方法可用於不含圖片的表單或控制項,但最常用於從指派給 Picture 屬性的點陣圖擷取色彩。
在 Visual Basic 2008 中,Point 方法已不存在。您可以使用 M:System.Drawing.Bitmap.GetPixel(System.Int32,System.Int32) 方法,從點陣圖擷取色彩值。若為不含圖片的表單或控制項,您可以查詢 BackColor 屬性。
Print 方法
在 Visual Basic 6.0 中,Print 方法可用來顯示表單或 PictureBox 控制項上的文字。顯示文字時,所使用的字型是由表單或控制項的 Font 屬性決定,而色彩是由 ForeColor 屬性決定。Print 方法不提供文字位置的控制,只能夠水平顯示文字。
在 Visual Basic 2008 中,DrawString 方法可用來顯示文字。字型是由 Font 物件決定,而色彩是由 Brush 物件決定。這兩者都會當做參數傳遞至 DrawString 方法。DrawString 方法也具有 X 和 Y 參數,可決定文字的開始位置。另有使用 StringFormat 物件的選擇性 Format 參數,讓您垂直顯示文字。
PSet 方法
在 Visual Basic 6.0 中,PSet 方法可用來變更表單或 PictureBox 控制項上的像素色彩。如果 DrawWidth 屬性設為大於 1 的值,則 PSet 方法會繪製實心圓。有個選擇性參數可用來指定色彩,如果省略這個參數,便會使用 ForeColor 。
Visual Basic 2008 中沒有 PSet 方法的對等用法。若要變更表單或 PictureBox 控制項上單一像素的色彩,請使用 DrawEllipse 方法,以 1 個像素的高度和寬度繪製圓形。當 DrawWidth 大於 1 時,若要複製 PSet 的功能,請使用 FillEllipse 方法。
圖形的程式碼變更
下列程式碼範例說明 Visual Basic 6.0 和 Visual Basic 2008 之間,程式碼撰寫技術的差異。
繪製簡單線條
下列程式碼會示範在執行階段,於表單上繪製線條。在 Visual Basic 6.0 範例中,使用了 Line 方法,將開始點和結束點的 X 與 Y 座標,以及色彩 (選擇項) 做為引數。Visual Basic 2008 範例則是使用 DrawLine 方法,將 Pens 物件和開始點與結束點的 X 及 Y 座標做為引數。
注意事項: |
---|
在 Visual Basic 6.0 中,預設的測量單位是 Twip,而在 Visual Basic 2008 中則是像素。 |
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a solid black line 200 twips from the top of the form.
Line (0, 200) - (ScaleWidth, 200), vbBlack
End Sub
' Visual Basic
Private Sub Form1_Paint(ByVal sender As Object, ByVal e _
As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a solid black line 25 pixels from the top of the form.
e.Graphics.DrawLine(Pens.Black, 0, 25, Me.Width, 25)
End Sub
繪製虛線
下列程式碼會示範在執行階段,於表單上繪製虛線。在 Visual Basic 6.0 範例中,DrawStyle 屬性會決定線條的外觀。Visual Basic 2008 範例則是使用 Pen 物件,並設定其 DashStyle 屬性來決定外觀。
注意事項: |
---|
在 Visual Basic 6.0 中,預設的測量單位是 Twip,而在 Visual Basic 2008 中則是像素。 |
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a dotted line 200 twips from the top of the form.
Me.DrawStyle = vbDot
Line (0, 200) - (ScaleWidth, 200), vbBlack
End Sub
' Visual Basic
Private Sub Form1_Paint1(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a dotted black line 25 pixels from the top of the form.
Dim LPen As New System.Drawing.Pen(System.Drawing.Color.Black)
LPen.DashStyle = Drawing2D.DashStyle.Dot
e.Graphics.DrawLine(LPen, 0, 25, Me.Width, 25)
End Sub
控制線條粗細
下列程式碼會示範在執行階段,於表單上繪製不同粗細的線條。在 Visual Basic 6.0 範例中,使用了 DrawWidth 屬性。Visual Basic 2008 範例則是使用 Pens 物件的 Width 屬性。
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a line with a thickness of 1 pixel.
DrawWidth = 1
Line (0, 200)-(ScaleWidth, 200), vbBlack
' Draw a line with a thickness of 5 pixels.
DrawWidth = 5
Line (0, 400)-(ScaleWidth, 400), vbBlack
' Draw a line with a thickness of 10 pixels.
DrawWidth = 10
Line (0, 600)-(ScaleWidth, 600), vbBlack
End Sub
' Visual Basic
Private Sub Form1_Paint2(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a line with a thickness of 1 pixel.
Dim TPen As New System.Drawing.Pen(System.Drawing.Color.Black, 1)
e.Graphics.DrawLine(TPen, 0, 25, Me.Width, 25)
' Draw a line with a thickness of 5 pixels.
TPen.Width = 5
e.Graphics.DrawLine(TPen, 0, 50, Me.Width, 50)
' Draw a line with a thickness of 10 pixels.
TPen.Width = 10
e.Graphics.DrawLine(TPen, 0, 75, Me.Width, 75)
End Sub
繪製圓形
下列程式碼會示範在執行階段,於表單上繪製圓形。在 Visual Basic 6.0 範例中,使用了 Circle 方法,使用中心點的 X 和 Y 座標、半徑和色彩 (選擇項) 做為引數。Visual Basic 2008 範例則是使用DrawEllipse 方法,將 Pen 物件、週框 (Bounding Rectangle) 左上角的 X 和 Y 座標,以及寬度和高度做為引數。
注意事項: |
---|
在 Visual Basic 6.0 中,預設的測量單位是 Twip,而在 Visual Basic 2008 中則是像素。 |
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a 1000 twip diameter red circle
Circle (500, 500), 500, vbRed
End Sub
' Visual Basic
Private Sub Form1_Paint3(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a 70 pixel diameter red circle.
e.Graphics.DrawEllipse(Pens.Red, 0, 0, 70, 70)
End Sub
繪製實心矩形
下列程式碼會示範在執行階段,於表單上繪製兩個矩形,一個是實心矩形,一個是交叉規劃的圖樣 (Hatched Pattern)。在 Visual Basic 6.0 範例中,FillColor 和 FillStyle 屬性會與 Line 方法一起使用。以 B 參數呼叫 Line 方法會繪製矩形。
Visual Basic 2008 範例則是使用 Graphics.Rectangle 方法繪製矩形,並使用 Graphics.FillRectangle 方法 (此方法會使用 Brush 物件) 做為引數。在此範例中,會同時使用 SolidBrush 和 HatchBrush 控制項。
注意事項: |
---|
在 Visual Basic 6.0 中,預設的測量單位是 Twip,而在 Visual Basic 2008 中則是像素。 |
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a solid red rectangle.
FillColor = vbRed
FillStyle = vbSolid
Line (10, 10)- (1000, 500), vbRed, B
' Draw a rectangle filled with a crosshatch pattern.
FillColor = vbBlack
FillStyle = vbCross
Line (10, 500)- (1000, 1000), vbBlack, B
End Sub
' Visual Basic
Private Sub Form1_Paint4(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a solid red rectangle.
Dim SBrush As New System.Drawing.SolidBrush _
(System.Drawing.Color.Red)
e.Graphics.DrawRectangle(Pens.Red, 2, 2, 70, 40)
e.Graphics.FillRectangle(SBrush, 2, 2, 70, 40)
' Draw a rectangle filled with a crosshatch pattern.
Dim HBrush As New System.Drawing.Drawing2D.HatchBrush( _
System.Drawing.Drawing2D.HatchStyle.Cross, _
System.Drawing.Color.Black, System.Drawing.Color.Transparent)
e.Graphics.DrawRectangle(Pens.Black, 2, 40, 70, 40)
e.Graphics.FillRectangle(HBrush, 2, 40, 70, 40)
End Sub
在表單上顯示影像
下列程式碼會示範圖形方法,以便在執行階段,於表單上顯示影像。Visual Basic 6.0 範例是使用 PaintPicture 方法。Visual Basic 2008 範例則是使用 DrawImage 方法。
' Visual Basic 6.0
Private Sub Form_Paint()
' Create a stdPicture object.
Dim Pict1 As New stdPicture
Pict1 = LoadPicture("C:\Windows\Greenstone.bmp")
PaintPicture Pict1, 0, 0
End Sub
' Visual Basic
Private Sub Form1_Paint5(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Create a Bitmap object.
Dim Pict1 As New Bitmap("C:\Windows\Greenstone.bmp")
e.Graphics.DrawImage(Pict1, 0, 0)
End Sub
在表單上顯示文字
下列程式碼會示範圖形方法,以便在執行階段,於表單上顯示文字字串。Visual Basic 6.0 範例是使用 Print 方法。Visual Basic 2008 範例則是使用 DrawString 方法。
' Visual Basic 6.0
Private Sub Form_Paint()
Me.Font.Size = 24
Me.Font.Bold = True
Me.ForeColor = vbRed
Print "Hello World!"
End Sub
' Visual Basic
Private Sub Form1_Paint6(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim TextFont As New System.Drawing.Font("Arial", 24, FontStyle.Bold)
Dim TextBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Red)
e.Graphics.DrawString("Hello World!", TextFont, TextBrush, 10, 10)
TextFont.Dispose()
TextBrush.Dispose()
End Sub
決定字串的高度和寬度
下列程式碼會示範圖形方法,以便在執行階段,判斷表單上的字串大小,然後在字串周圍繪製矩形。Visual Basic 6.0 範例是使用 TextHeight 和 TextWidth 方法。Visual Basic 2008 範例則是使用 MeasureString 方法,傳回 SizeF 結構。
' Visual Basic 6.0
Private Sub Form_Paint()
Me.Font.Size = 24
Me.Font.Bold = True
Me.ForeColor = vbRed
Print "Hello World!"
Line (0, 0)-(TextWidth("Hello World!"), _
TextHeight("Hello World!")), vbBlack, B
End Sub
' Visual Basic
Private Sub Form1_Paint7(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim TextFont As New System.Drawing.Font("Arial", 24, FontStyle.Bold)
Dim TextBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Red)
e.Graphics.DrawString("Hello World!", TextFont, TextBrush, 10, 10)
Dim TextSize As New System.Drawing.SizeF
TextSize = e.Graphics.MeasureString("Hello World!", TextFont)
e.Graphics.DrawRectangle(Pens.Black, 10, 10, TextSize.Width, TextSize.Height)
TextFont.Dispose()
TextBrush.Dispose()
End Sub
繪製單一像素
下列程式碼會示範圖形方法,以便在執行階段,變更表單上的單一像素色彩。Visual Basic 6.0 範例是使用 PSet 方法。Visual Basic 2008 範例則是使用 DrawEllipse 方法,搭配設定為 1 的 Height 和 Width 參數。
注意:在 Visual Basic 6.0 中,預設的測量單位是 Twip,而在 Visual Basic 2008 中則是像素。
' Visual Basic 6.0
Private Sub Form_Paint()
Me.DrawWidth = 1
PSet (1000, 1000), vbRed
End Sub
' Visual Basic
Private Sub Form1_Paint8(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
e.Graphics.DrawEllipse(Pens.Red, 70, 70, 1, 1)
End Sub
決定單一像素的色彩
下列程式碼會示範圖形方法,以便在執行階段,判斷表單上的影像中,位於指定位置的像素色彩,然後以該色彩繪製實心矩形。Visual Basic 6.0 範例是使用 Point 方法擷取色彩值。Visual Basic 2008 範例則是使用 GetPixel 方法。
注意事項: |
---|
在 Visual Basic 6.0 中,預設的測量單位是 Twip,而在 Visual Basic 2008 中則是像素。 |
' Visual Basic 6.0
Private Sub Form_Paint()
Dim PixelColor As Long
Picture1.Picture = LoadPicture("C:\Windows\Greenstone.bmp")
PixelColor = Picture1.Point(10, 10)
FillColor = PixelColor
Line (0, 0)-(100, 500), PixelColor, B
End Sub
' Visual Basic
Private Sub Form1_Paint9(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim Pict1 As New Bitmap("C:\Windows\Greenstone.bmp")
Picture1.Image = Pict1
Dim PixelColor As Color = Pict1.GetPixel(4, 4)
Dim PixelBrush As New SolidBrush(PixelColor)
e.Graphics.FillRectangle(PixelBrush, 0, 0, 100, 100)
End Sub
圖形屬性和方法的對等用法
下表列出 Visual Basic 6.0 的圖形屬性和方法,以及其在 Visual Basic 2008 的對等用法。
Visual Basic 6.0 |
Visual Basic 2008 對等用法 |
---|---|
AutoRedraw 屬性 |
新實作。若要保存圖形,請將繪圖方法放置在 Paint 事件中。 |
Circle 方法 |
DrawEllipse 方法 |
ClipControls 屬性 |
新實作。不再需要 ClipControls 屬性。 |
Cls 方法 |
Clear 方法 |
CurrentX 屬性 |
各種圖形方法的 x 參數。例如,DrawRectangle (pen, x, y, width, height) |
CurrentY 屬性 |
各種圖形方法的 y 參數。例如,DrawRectangle (pen, x, y, width, height) |
DrawMode 屬性 |
新實作。不再需要 DrawMode 屬性。 |
DrawStyle 屬性 |
DashStyle 屬性 |
DrawWidth 屬性 |
Width 屬性 |
FillColor 屬性 |
SolidBrush 物件 |
FillStyle 屬性 |
HatchBrush 物件 |
HasDC 屬性 |
新實作。GDI+ 不再需要裝置內容。 |
HDC 屬性 |
新實作。GDI+ 不再需要裝置內容。 |
Image 屬性 |
新實作。 |
Line 方法 |
DrawLine 方法 |
PaintPicture 方法 |
DrawImage 方法 |
Point 方法 |
沒有直接的對等用法。若為點陣圖,請使用 Bitmap.GetPixel。若為表單或控制項,請使用 BackColor屬性。 |
Print 方法 |
DrawString 方法 |
Pset 方法 |
DrawEllipse、FillEllipse 方法 |
TextHeight、TextWidth 屬性 |
MeasureString 方法 |
升級注意事項
應用程式從 Visual Basic 6.0 升級為 Visual Basic 2008 時,不會升級圖形方法,且程式碼中會插入警告。由於 GDI 和 GDI+ 之間有相當大的差異,您將需要重寫任何現有的圖形程式碼。