從頭建立 Visual Basic .NET 控制項 (五)

來源:互聯網
上載者:User
visual|建立|控制項 第 4 步:繪製控制項的外觀
要使控制項具有一個可視的外觀,我們需要在 Paint 事件中放置邏輯。然後,每次控制項需要重新整理其可視外觀時,就會運行該邏輯。

Windows 表單中的 Paint 邏輯使用 .NET 中 GDI+ 部分中的類。這些類基本上包括了 Windows API 圖形功能。由於適合 .NET,所以比 API 更便於使用。但是,有關它們的工作原理,需要理解以下幾點。

在 Windows API 中,圖形操作需要一個視窗控制代碼,有時稱為 hWnd。在 GDI+ 中,它由 Graphics 對象取代,該對象不僅代表了繪圖區域,還提供在該地區執行的操作(方法)。

例如,Graphics 對象具有以下方法,可用來繪製各種螢幕元素:

DrawCurve
DrawEllipse
DrawLine
DrawPolygon
DrawRectangle
DrawString
FillEllipse
FillPolygon
這些都是很容易理解的,只是可用方法的樣本。一些更複雜的方法還允許旋轉對象。我們將使用 DrawRectangle 方法繪製邊框,使用 FillEllipse 方法繪製彩色的圓。

大多數繪圖方法都要求使用 Pen 或 Brush 對象。Pen 對象用於繪製直線並確定直線的顏色和粗細。Brush 對象用於填充地區、確定填充地區所使用的顏色,以及一些特殊效果(例如,用位元影像填充地區)。我們將使用特殊的 Brush 效果使當前沒有亮起的燈的顏色變暗。

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

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

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

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

    ' 現在繪製紅綠燈周圍的輪廓
    ' 用畫筆繪製輪廓,將它塗成黑色。
    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)

    ' 釋放繪圖物件
    penDrawingPen.Dispose()
    grfGraphics.Dispose()

End Sub

首先使用基類繪製,它通常使用控制項的背景顏色繪製背景。然後,從事件參數中擷取控制項的 Graphics 對象。

接下來,用一個函數畫出三個圓。有關該函數的內容稍後介紹。請注意,我們必須向該函數傳遞一個 Graphics 對象的引用,同時還要指示要畫的圓(紅、黃、綠)。

然後是繪製輪廓的代碼。聲明一個具有適當位置和大小的矩形,然後傳遞給 Graphics 對象的 DrawRectangle 方法。

最後,繪圖物件啟用其 Dispose 方法。使用 GDI+ 時,最好在完成繪圖物件後立即釋放它們。這有助於清除作業系統繪圖時所用的資源。如果要在 Windows® 98 或 Windows Me 中使用控制項,管理圖形資源就更加重要,因為這些作業系統處理這種資源的能力較差。

下面是繪製圓的函數:

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 座標和直徑
    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

這是整個控制項中唯一的一個複雜圖形。在 GDI+ 中,在要繪製橢圓的矩形中指定左上方的 X 座標和 Y 座標,然後指定矩形的高度和寬度即可繪製一個橢圓。我們分別將 X 座標和 Y 座標稱為 nCircleX 和 nCircleY。因為我們要繪製一個圓,因此矩形的高度等於寬度,用變數 nCircleDiameter 來控制該值。

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

要繪製實心橢圓,還需完成一件事,即確定要使用的顏色。顏色取決於正在繪製哪個燈以及正在繪製的燈是否亮起。亮起的燈的顏色要比熄滅的燈的顏色亮。

建立繪圖要使用的筆刷時需要使用這些顏色。如果正在繪製的燈是亮起的,即使用該顏色。如果繪製的燈是熄滅的,則要使用不同的方法執行個體化筆刷。下面是熄滅的燈所使用筆刷的程式碼:

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

這並不是 .NET 中較好的方法名,但 FromArgB 方法的作用是建立筆刷,並通過將筆刷與背景顏色相結合來淡化顏色。第一個參數使用的數字介於 0 至 255 之間,數字越小,背景顏色滲透越深。我們使用的值為 60,它將大大降低處於熄滅狀態的燈的顏色。您可以嘗試對該參數使用不同的值(或將它設定成可設定屬性),以獲得不同的效果。

最後,Graphics 對象的 DrawEllipse 方法繪製出該圓,函數結束。記住,該函數需要調用三次以繪製三個不同的圓。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。