vb.net點擊按鈕無效的toolbar

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- vb.net點擊按鈕無效的toolbar (http://www.webasp.net/article/18/17902.htm)
-- 作者:未知
-- 發佈日期: 2005-04-25
  
大家寫程序的時候,都會遇到現有控件不能滿足要求的問題,這時需要借助第三方控件或者自己重新改寫現有控件。前者就不多說了,網上找,公司裡找,同學中找。如果是自己寫呢?我的體會如下:
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

webasp.net