明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

從頭創(chuàng)建 Visual Basic .NET 控件 (5)

[摘要]第 4 步:繪制控件的外觀要使控件具有一個(gè)可視的外觀,我們需要在 Paint 事件中放置邏輯。然后,每次控件需要刷新其可視外觀時(shí),就會(huì)運(yùn)行該邏輯。Windows 窗體中的 Paint 邏輯使用 .N...
第 4 步:繪制控件的外觀
要使控件具有一個(gè)可視的外觀,我們需要在 Paint 事件中放置邏輯。然后,每次控件需要刷新其可視外觀時(shí),就會(huì)運(yùn)行該邏輯。

Windows 窗體中的 Paint 邏輯使用 .NET 中 GDI+ 部分中的類。這些類基本上包括了 Windows API 圖形功能。由于適合 .NET,所以比 API 更易于使用。但是,有關(guān)它們的工作原理,需要理解以下幾點(diǎn)。

在 Windows API 中,圖形操作需要一個(gè)窗口句柄,有時(shí)稱為 hWnd。在 GDI+ 中,它由 Graphics 對(duì)象取代,該對(duì)象不僅代表了繪圖區(qū)域,還提供在該區(qū)域執(zhí)行的操作(方法)。

例如,Graphics 對(duì)象具有以下方法,可用來繪制各種屏幕元素:

DrawCurve
DrawEllipse
DrawLine
DrawPolygon
DrawRectangle
DrawString
FillEllipse
FillPolygon
這些都是很容易理解的,只是可用方法的示例。一些更復(fù)雜的方法還允許旋轉(zhuǎn)對(duì)象。我們將使用 DrawRectangle 方法繪制邊框,使用 FillEllipse 方法繪制彩色的圓。

大多數(shù)繪圖方法都要求使用 Pen 或 Brush 對(duì)象。Pen 對(duì)象用于繪制直線并確定直線的顏色和粗細(xì)。Brush 對(duì)象用于填充區(qū)域、確定填充區(qū)域所使用的顏色,以及一些特殊效果(例如,用位圖填充區(qū)域)。我們將使用特殊的 Brush 效果使當(dāng)前沒有亮起的燈的顏色變暗。

下面是處理控件的 Paint 事件的代碼:

Protected Overrides Sub OnPaint(ByVal pe As _
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(pe)

Dim grfGraphics As System.Drawing.Graphics
grfGraphics = pe.Graphics

' 首先繪制三個(gè)代表燈的圓。
' 一個(gè)亮起,其余兩個(gè)熄滅。
DrawLight(TrafficLightStatus.statusGreen, grfGraphics)
DrawLight(TrafficLightStatus.statusYellow, grfGraphics)
DrawLight(TrafficLightStatus.statusRed, grfGraphics)

' 現(xiàn)在繪制紅綠燈周圍的輪廓
' 用畫筆繪制輪廓,將它涂成黑色。
Dim penDrawingPen As New _
System.Drawing.Pen(System.Drawing.Color.Black, msngBorderWidth)

' 在控件上繪制紅綠燈的輪廓。
' 首先定義要繪制的矩形。
Dim rectBorder As System.Drawing.Rectangle

rectBorder.X = 1
rectBorder.Y = 1
rectBorder.Height = Me.Height - 2
rectBorder.Width = Me.Width - 2
grfGraphics.DrawRectangle(penDrawingPen, rectBorder)

' 釋放圖形對(duì)象
penDrawingPen.Dispose()
grfGraphics.Dispose()

End Sub

首先使用基類繪制,它通常使用控件的背景顏色繪制背景。然后,從事件參數(shù)中獲取控件的 Graphics 對(duì)象。

接下來,用一個(gè)函數(shù)畫出三個(gè)圓。有關(guān)該函數(shù)的內(nèi)容稍后介紹。請(qǐng)注意,我們必須向該函數(shù)傳遞一個(gè) Graphics 對(duì)象的引用,同時(shí)還要指示要畫的圓(紅、黃、綠)。

然后是繪制輪廓的代碼。聲明一個(gè)具有適當(dāng)位置和大小的矩形,然后傳遞給 Graphics 對(duì)象的 DrawRectangle 方法。

最后,圖形對(duì)象激活其 Dispose 方法。使用 GDI+ 時(shí),最好在完成圖形對(duì)象后立即釋放它們。這有助于清除操作系統(tǒng)繪圖時(shí)所用的資源。如果要在 Windows® 98 或 Windows Me 中使用控件,管理圖形資源就更加重要,因?yàn)檫@些操作系統(tǒng)處理這種資源的能力較差。

下面是繪制圓的函數(shù):

Private Sub DrawLight(ByVal LightToDraw As TrafficLightStatus, _
ByVal grfGraphics As Graphics)

Dim nCircleX As Integer
Dim nCircleY As Integer
Dim nCircleDiameter As Integer
Dim nCircleColor As Color

' 找到所有圓的 X 坐標(biāo)和直徑
nCircleX = CInt(Me.Size.Width * 0.02)
nCircleDiameter = CInt(Me.Size.Width * 0.96)
Select Case LightToDraw
Case TrafficLightStatus.statusRed
If LightToDraw = Me.Status Then
nCircleColor = Color.OrangeRed
Else
nCircleColor = Color.Maroon
End If
nCircleY = CInt(Me.Size.Height * 0.01)
Case TrafficLightStatus.statusYellow
If LightToDraw = Me.Status Then
nCircleColor = Color.Yellow
Else
nCircleColor = Color.Tan
End If
nCircleY = CInt(Me.Size.Height * 0.34)
Case TrafficLightStatus.statusGreen
If LightToDraw = Me.Status Then
nCircleColor = Color.LimeGreen
Else
nCircleColor = Color.ForestGreen
End If
nCircleY = CInt(Me.Size.Height * 0.67)

End Select
Dim bshBrush As System.Drawing.Brush
If LightToDraw = Me.Status Then

bshBrush = New SolidBrush(nCircleColor)
Else
bshBrush = New SolidBrush(Color.FromArgb(60, nCircleColor))
End If

' 繪制代表紅綠燈的圓
grfGraphics.FillEllipse(bshBrush, nCircleX, nCircleY, nCircleDiameter, nCircleDiameter)

' 釋放筆刷
bshBrush.Dispose()

End Sub

這是整個(gè)控件中唯一的一個(gè)復(fù)雜圖形。在 GDI+ 中,在要繪制橢圓的矩形中指定左上角的 X 坐標(biāo)和 Y 坐標(biāo),然后指定矩形的高度和寬度即可繪制一個(gè)橢圓。我們分別將 X 坐標(biāo)和 Y 坐標(biāo)稱為 nCircleX 和 nCircleY。因?yàn)槲覀円L制一個(gè)圓,因此矩形的高度等于寬度,用變量 nCircleDiameter 來控制該值。

將 nCircleX 設(shè)置為剛好放到控件內(nèi)(控件的寬度乘以 0.02)。nCircleY 取決于要繪制哪個(gè)燈,可以設(shè)置成靠近控件的頂部(紅燈)、大約向下三分之一(黃燈)或大約向下三分之二(綠燈)。直徑 nCircleDiameter 設(shè)置為等于控件寬度的 96%。

要繪制實(shí)心橢圓,還需完成一件事,即確定要使用的顏色。顏色取決于正在繪制哪個(gè)燈以及正在繪制的燈是否亮起。亮起的燈的顏色要比熄滅的燈的顏色亮。

創(chuàng)建繪圖要使用的筆刷時(shí)需要使用這些顏色。如果正在繪制的燈是亮起的,即使用該顏色。如果繪制的燈是熄滅的,則要使用不同的方法實(shí)例化筆刷。下面是熄滅的燈所使用筆刷的代碼行:

bshBrush = New SolidBrush(Color.FromArgb(60, nCircleColor))

這并不是 .NET 中較好的方法名,但 FromArgB 方法的作用是創(chuàng)建筆刷,并通過將筆刷與背景顏色相結(jié)合來淡化顏色。第一個(gè)參數(shù)使用的數(shù)字介于 0 至 255 之間,數(shù)字越小,背景顏色滲透越深。我們使用的值為 60,它將大大降低處于熄滅狀態(tài)的燈的顏色。您可以嘗試對(duì)該參數(shù)使用不同的值(或?qū)⑺O(shè)置成可設(shè)置屬性),以獲得不同的效果。

最后,Graphics 對(duì)象的 DrawEllipse 方法繪制出該圓,函數(shù)結(jié)束。記住,該函數(shù)需要調(diào)用三次以繪制三個(gè)不同的圓。