大家寫程序的時候,都會遇到現有控件不能滿足要求的問題,這時需要借助第三方控件或者自己重新改寫現有控件。前者就不多說了,網上找,公司裡找,同學中找。如果是自己寫呢?我的體會如下:
1.看清需求。知道自己想做什麼,需要完成什麼樣的功能。拿下面代碼舉例:需求-toolbarbutton必須為可用;當左鍵點擊toolbarbutton時,由主程序來通過一些條件(如用戶是否按照規定的步驟操作)判斷是否忽略該消息,忽略消息後界面應該沒有任何變化。
2.尋找差距。找出自己想要的功能和現有控件的差別。拿下面代碼舉例:現有控件toolbar中,只要左鍵點擊可用的toolbarbutton,該button都會有所反映;而需求是不讓它有反應。
3.尋找現有控件如何實現差距。拿下面代碼舉例:toolbar在繪製過程中沒有使用可重寫的onpaint方法,所以重寫onpaint方法不能完成需求。在哪能提取到重繪的信息呢?WndProc。
4.設計好類的接口。之所以我們要重寫現有控件,是因為我們要使用它現在沒有的功能,所以把接口設計好,對以後的修改大有裨益。拿下面代碼舉例:提供給主程序的事件參數中就包含了toolbarbuttons,可能以後主程序要根據鼠標的左右鍵作一些判斷,或修改一些外觀。
5.開始編碼。盡量規範,以便以後修改、查看。
代碼如下:
Public Class clsToolBar
Inherits ToolBar
Public Event PreviewButtonClick As PreviewButtonClickHandler
Private m_blnCanDown As Boolean = True
Private Function ZGetMouseDownButton(ByVal point As Point) As ToolBarButton
For Each _tbtn As ToolBarButton In Me.Buttons
If _tbtn.Rectangle.Contains(point) Then
Return _tbtn
End If
Next
Return Nothing
End Function
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = CInt(&H201) OrElse m.Msg = CInt(&H203) Then『鼠標左鍵為&H201,雙擊為&H203
Dim _point As Point = Me.PointToClient(Me.MousePosition)
Dim _tbtnTemp As ToolBarButton = ZGetMouseDownButton(_point)
If Not _tbtnTemp Is Nothing Then
Dim _args As New MyButtonClickEventArgs(MouseButtons.Left, _tbtnTemp)
RaiseEvent PreviewButtonClick(Me, _args)
If _args.Cancel Then
m_blnCanDown = False
Exit Sub
End If
End If
End If
If m.Msg = CInt(&HF) Then重畫為&HF
If m_blnCanDown = False Then
Exit Sub
End If
End If
If m.Msg = CInt(&H200) Then移動鼠標為&H200
m_blnCanDown = True
End If
MyBase.WndProc(m)
End Sub
End Class
Public Delegate Sub PreviewButtonClickHandler(ByVal s As Object, ByVal e As MyButtonClickEventArgs)
Public Class MyButtonClickEventArgs
Private m_blnCancel As Boolean = False
Private m_btnClick As MouseButtons
Public Property Cancel() As Boolean
Get
Return Me.m_blnCancel
End Get
Set(ByVal Value As Boolean)
Me.m_blnCancel = Value
End Set
End Property
Public ReadOnly Property MouseButton() As MouseButtons
Get
Return Me.m_btnClick
End Get
End Property
Public ToolBarButton As ToolBarButton
Public Sub New(ByVal MouseButton As MouseButtons, ByVal button As ToolBarButton)
Me.m_btnClick = MouseButton
Me.ToolBarButton = button
End Sub
End Class
|
|