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 |