正常情況下
在開發
NET Windows應用程序時
我們都會用到System
Windows
Forms名字空間的控件
可供我們使用的控件很多
從Label
TextBox等簡單的控件到MonthCalendar
ColorDialog等功能更豐富
更復雜的控件
盡管這些控件對於我們需要開發的大多數Windows應用程序已經足夠好了
但有時我們也需要自己開發一些System
Windows
Forms名字空間不包括的控件
本篇文章將講述如何使用VB
NET創建定制控件
尤其是在需要提供自己的圖形用戶接口時
開發定制的控件並不困難
在開發定制控件時
我們可以使用現有的控件
或者對Control或UserControl類進行擴展
結合使用現有的控件使我們減少提供接口的麻煩
擴展Control或UserControl類意味著我們需要覆蓋OnPaint方法
自己繪制圖形用戶接口
本篇文章中
我們由UserControl類派生了一個定制控件
UserControl類本身也是由繼承Control類而生成的
因此讀者需要對這二個類有一定的了解
Control類非常重要
因為它是Windows可視化組件的父類
我們開發的定制類將是Control類的一個子類
我們的定制類一般不會直接由Control類派生而成
相反
一般是對UserControl類進行擴展
一Control類 Control類提供向Windows應用程序用戶顯示信息的類所要求的基本功能
它處理用戶通過鍵盤和鼠標進行的輸入
以及消息的分配和安全
更重要的是
Control類定義了控件的范圍(位置和大小)
盡管它不實現控件的繪制
Windows表單控件使用了環境屬性
因此其子控件的顯示與其周圍環境相似
缺省情況下
環境屬性是由其父控件獲得的
如果類沒有父控件或者其環境屬性沒有設置
則控件試圖通過Site 屬性設置環境屬性的值
如果控件沒有確定位置
不支持環境屬性
或者AmbientProperties 對象的屬性沒有設置
控件就會使用缺省值
一般情況下
控件的環境特性表示控件的一個特征
例如BackColor
它會傳遞給子控件
例如
缺省情況下
Button控件將具有與其父表單控件相同的BackColor環境屬性
許多Control類的屬性
方法和事件都會不加變化地傳遞給子類
1
Control類的屬性
下面是Control類的一些最重要的屬性
★ BackColor
控件的背景顏色
是由一個System
Drawing
Color對象表示的
我們可以使用如下所示的代碼將一個System
Drawing
Color對象賦給該屬性
control
BackColor = System
Drawing
Color
Red
★ 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