• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

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

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

        更新時間:2020-02-09 文章作者:未知 信息來源:網絡 閱讀次數:

        第 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 方法繪制出該圓,函數結束。記住,該函數需要調用三次以繪制三個不同的圓。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 在线观看亚洲专区| a级大片免费观看| 伊人久久大香线蕉亚洲| 91香焦国产线观看看免费| 亚洲精品无码专区在线播放| 国产亚洲AV手机在线观看| 亚洲精品在线免费观看| 深夜特黄a级毛片免费播放| 亚洲精品国产成人中文| 日本免费人成视频播放| 日本人成在线视频免费播放| 亚洲gay片在线gv网站| 亚洲av永久无码精品国产精品| 在线观看人成视频免费| 免费福利电影在线观看| 精品成人一区二区三区免费视频| 亚洲avav天堂av在线不卡| 一本久到久久亚洲综合| 无码区日韩特区永久免费系列| 一级做受视频免费是看美女| 亚洲av日韩av无码av| 亚洲精品成人网站在线观看| 国产福利免费观看| 亚洲毛片在线免费观看| 91免费在线视频| 美女露100%胸无遮挡免费观看 | 亚洲av中文无码乱人伦在线咪咕| 成年女人毛片免费播放视频m| 国产免费拔擦拔擦8X高清在线人 | 四虎影视在线看免费观看| 亚洲中文字幕久久无码| 亚洲国产精品久久久久久| 久久亚洲高清综合| 国产精品成人免费综合| 黄页网站免费在线观看| 久久成人a毛片免费观看网站| eeuss草民免费| 男人免费视频一区二区在线观看| 亚洲日韩av无码中文| 亚洲国产精品专区| 亚洲网址在线观看你懂的|