熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

使用VB.NET開發定制控件

2013-11-13 12:21:25  來源: .NET編程 
 正常情況下在開發NET Windows應用程序時我們都會用到SystemWindowsForms名字空間的控件可供我們使用的控件很多從LabelTextBox等簡單的控件到MonthCalendarColorDialog等功能更豐富更復雜的控件盡管這些控件對於我們需要開發的大多數Windows應用程序已經足夠好了但有時我們也需要自己開發一些SystemWindowsForms名字空間不包括的控件本篇文章將講述如何使用VBNET創建定制控件尤其是在需要提供自己的圖形用戶接口時

  開發定制的控件並不困難在開發定制控件時我們可以使用現有的控件或者對Control或UserControl類進行擴展結合使用現有的控件使我們減少提供接口的麻煩擴展Control或UserControl類意味著我們需要覆蓋OnPaint方法自己繪制圖形用戶接口本篇文章中我們由UserControl類派生了一個定制控件UserControl類本身也是由繼承Control類而生成的因此讀者需要對這二個類有一定的了解

  Control類非常重要因為它是Windows可視化組件的父類我們開發的定制類將是Control類的一個子類我們的定制類一般不會直接由Control類派生而成相反一般是對UserControl類進行擴展

  Control類

  Control類提供向Windows應用程序用戶顯示信息的類所要求的基本功能它處理用戶通過鍵盤和鼠標進行的輸入以及消息的分配和安全更重要的是Control類定義了控件的范圍(位置和大小)盡管它不實現控件的繪制

  Windows表單控件使用了環境屬性因此其子控件的顯示與其周圍環境相似缺省情況下環境屬性是由其父控件獲得的如果類沒有父控件或者其環境屬性沒有設置則控件試圖通過Site 屬性設置環境屬性的值如果控件沒有確定位置不支持環境屬性或者AmbientProperties 對象的屬性沒有設置控件就會使用缺省值一般情況下控件的環境特性表示控件的一個特征例如BackColor它會傳遞給子控件例如缺省情況下Button控件將具有與其父表單控件相同的BackColor環境屬性

  許多Control類的屬性方法和事件都會不加變化地傳遞給子類

  1Control類的屬性

  下面是Control類的一些最重要的屬性

  ★ BackColor
  控件的背景顏色是由一個SystemDrawingColor對象表示的我們可以使用如下所示的代碼將一個SystemDrawingColor對象賦給該屬性
controlBackColor = SystemDrawingColorRed

  ★ Enabled
  一個表示該控件是否可用的布爾型值缺省情況下其值為True

  ★ Location
  控件的左上角在其窗口中的位置由一個SystemDrawingPoint對象表示

  ★ Name
  控件的名字

  ★ Parent
  返回控件的父控件或容器的引用例如在一個表單中添加的控件的父控件就是該表單下面的代碼將Button控件所在的表單的標題欄改為Thank you
ButtonParentText = Thank you

  ★ Size
  控件的大小由SystemDrawingSize對象表示

  ★ Text
  與控件相關的字符串例如在Label控件中Text屬性就是顯示在標簽體上的字符串

  2Control類的方法

  下面是一些Control類最經常使用的方法

  ★ BringToFront
  如果該控件在其他一些控件下面完整地顯示該控件換一句話說這一方法能夠顯示一個完整的控件

  ★ CreateGraphics
  獲取控件的SystemDrawingGraphics對象我們可以在其上利用SystemDrawingGraphics 類的各種方法進行顯示例如下面的代碼獲取名字為Button的控件的Graphics圖像然後在按鈕上劃一條對角的綠線
Imports SystemDrawing

Dim graphics As Graphics = ButtonCreateGraphics
Dim pen As Pen = New Pen(ColorGreen)
graphicsDrawLine(pen _
ButtonSizeWidth ButtonSizeHeight)

  但是用這種方法在控件上畫圖所畫的圖像不是永久當控件或者包含控件的表單被重畫時用這種方式畫的圖像就會消失

  ★ Focus
  將焦點給予該控件使它成為活動控件
  
  ★ Hide
  將控件的Visible屬性設置為False使它不被顯示出來

  ★ GetNextControl
  按Tab鍵控制次序返回下一個控件

  ★ OnXXX
  觸發XXX事件這裡的XXX可以是ClickControlAddedControlRemovedDoubleClickDragDropDragEnterDragLeaveDragOverEnterGotFocusKeyDownKeyPressKeyUpLostFocusMouseDownMouseEnterMouseHoverMouseLeaveMouseMoveMouseUpMovePaintResize和TextChanged例如調用控件的OnClick方法就會觸發其Click事件

  ★ Show
  將控件的Visible屬性設置為True以顯示該控件

  UserControl類

  UserControl類提供一個可以用來創建其他控件的空控件它是Control類的一個間接子類由該控件派生的對象如下所示

  ·SystemObject
  ·SystemMarshalByRefObject
  ·SystemComponentModelComponent
  ·SystemWindowsFormsControl
  ·SystemWindowsFormsScrollableControl
  ·SystemWindowsFormsContainerControl
  ·SystemWindowsFormsUserControl

  UserControl類從ContainerControl類繼承所有的標准位置和與內存處理有關的代碼在用戶定制控件中還需要這些代碼

  RoundButton控件

  有了Control和UserControl這二個類開發定制的Windows控件就是輕而易舉的了我們的定制類是通過繼承UserControl類而生成的由於UserControl也是由繼承Control類而生成的我們的定制類將會繼承Control類的所有有用的方法屬性和事件例如由於是繼承Control類生成的我們的定制類會自動地擁有事件處理程序

  在開發定制控件時特別重要的一個問題是如何顯示定制控件的用戶界面無論如何組織定制控件需要注意的是定制控件有時會重新顯示因此當定制控件重繪時必須重新繪制用戶界面考慮到控件每次重繪時都會調用Control類的OnPaint方法使用新的繪制定制控件用戶界面的OnPaint方法覆蓋該方法就能保證定制控件的保持一定的外觀

  表中的代碼是一個名稱為RoundButton的控件在圖表單上有一個RoundButton定制控件是其代碼我們需要作的工作基本上就是覆蓋OnPaint方法系統向該方法傳遞一個PaintEventArgs對象從該方法中我們可以獲得控件的SystemDrawingGraphics對象然後使用它的方法繪制定制控件的用戶界面

RoundButton控件

Imports SystemWindowsForms
Imports SystemDrawing

Public Class RoundButton : Inherits UserControl


Public BackgroundColor As Color = ColorBlue
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

Dim graphics As Graphics = eGraphics
Dim penWidth As Integer =
Dim pen As Pen = New Pen(ColorBlack )

Dim fontHeight As Integer =
Dim font As Font = New Font(Arial fontHeight)

Dim brush As SolidBrush = New SolidBrush(BackgroundColor)
graphicsFillEllipse(brush Width Height)
Dim textBrush As SolidBrush = New SolidBrush(ColorBlack)

graphicsDrawEllipse(pen CInt(penWidth / ) _
CInt(penWidth / ) Width penWidth Height penWidth)

graphicsDrawString(Text font textBrush penWidth _
Height / fontHeight)
End Sub
End Class

  表中的代碼非常地簡單簡直令人不能相信我們的定制類只有一個方法OnPaint簡單地說該方法傳遞一個PaintEventArgs對象從中我們可以獲得SystemDrawingGraphics對象這一Graphics對象表示我們的定制控件的繪制區無論在該Graphics對象上繪制什麼東西它都會顯示為定制用戶控件的界面

  在Windows的編程中繪制圖形時需要用到筆畫筆等對象要書寫文本就需要字體對象下面OnPaint方法中的代碼創建了一個寬度為的SystemDrawingPen對象

Dim penWidth As Integer =
Dim pen As Pen = New Pen(ColorBlack )


  然後再創建一個高度為的Arial Font對象

Dim fontHeight As Integer =
Dim font As Font = New Font(Arial fontHeight)

  我們要作的最後一步的准備工作是實例化一個SolidBrush對象並使其顏色與backgroundColor字段的顏色一致
Dim brush As SolidBrush = New SolidBrush(backgroundColor)

  現在我們就可以來畫了對於控制的底部我們可以使用Graphics類的FillEllipse方法圓的高和寬與控件的高和寬是相同的
graphicsFillEllipse(brush Width Height)

  然後我們可以實例化另一個畫筆用來完成對文本的繪制
Dim textBrush As SolidBrush = New SolidBrush(ColorBlack)


  至於圓形我們可以使用Graphics類的DrawEllipse方法
graphicsDrawEllipse(pen Cint(penWidth/) _
CInt(penWidth/) Width penWidth Height penWidth)


  最後我們使用DrawString方法在Graphics對象上繪制文本內容
graphicsDrawString(Text font textBrush penWidth _
Height / fontHeight)


  我們最後得到的RoundButton控件如下圖所示


picture

  好了把控件的代碼編譯為一個DLL文件它就可以供我們隨時使用了

  表中的代碼是一個調用了RoundButton控件名稱為MyForm的表單

RoundButton控件的調用

Public Class MyForm
Inherits SystemWindowsFormsForm

#Region Windows Form Designer generated code

Private WithEvents roundButton As RoundButton
Public Sub New()
MyBaseNew()

這個調用是Windows Form Designer所要求的
InitializeComponent()

在InitializeComponent()調用後可以添加任意的實例化代碼

End Sub

表單覆蓋整理組件列表
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
componentsDispose()
End If
End If
MyBaseDispose(disposing)
End Sub

Windows Form Designer所要求的
Private components As SystemComponentModelIContainer

注意下面的過程是Windows Form Designer所要求的
可以使用Windows Form Designer對它進行修改
但不要使用軟件編輯程序進行修改
Private Sub InitializeComponent()

MyForm

MeAutoScaleBaseSize = New SystemDrawingSize( )
MeClientSize = New SystemDrawingSize( )
MeName = MyForm
MeText = Using Custom Control

roundButton = New RoundButton()
AddHandler roundButtonClick AddressOf roundButton_Click
roundButtonText = Click Here!
roundButtonBackgroundColor = SystemDrawingColorWhite
roundButtonSize = New SystemDrawingSize( )
roundButtonLocation = New SystemDrawingPoint( )
MeControlsAdd(roundButton)

End Sub

#End Region

Private Sub roundButton_Click(ByVal source As Object ByVal e As EventArgs)
MessageBoxShow(Thank you)
End Sub
Public Shared Sub Main()
Dim form As MyForm = New MyForm()
ApplicationRun(form)
End Sub

End Class

  在InitializeComponent方法中表單對一個RoundButton對象進行實例化並將RoundButton 控件的Click事件與事件處理程序roundButton_Click連接起來
roundButton = New RoundButton()
AddHandler roundButtonClick AddressOf roundButton_Click

  需要注意的是由於我們沒有在RoundButton類中定義任何事件因此它的事件處理能力是繼承Control類而得來的

  我們下一步要作的就是設置RoundButton控件的一些屬性了
roundButtonText = Click Here!
roundButtonBackgroundColor = SystemDrawingColorWhite
roundButtonSize = New SystemDrawingSize( )
roundButtonLocation = New SystemDrawingPoint( )

  最後將roundButton控件添加到表單的控件集中
MeControlsAdd(roundButton)

  當用戶點擊控件觸發Click事件時Click事件調用roundButton_Click事件處理程序顯示一個消息框
Private Sub roundButton_Click(ByVal source As Object _
ByVal e As EventArgs)
MessageBoxShow(Thank you)
End Sub

  結論

  在本篇文章中我們介紹了開發定制控件時需要理解的SystemWindowsForms名字空間中二個重要的類Control和UserControl另外我們還介紹了如何通過直接擴充UserControl類開發自己的定制控件以及如何在Windows表單中使用定制控件


From:http://tw.wingwit.com/Article/program/net/201311/15739.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.