ボタンオブジェクトは"e.Button"で取得できますので、これを使って処理を振り分けています。"if...else..."文を使っていますが、"Select...Case..."の方がすっきりまとまりそうです。ただし、速さは若干"if...else..."分の方が早いようです。
' ツールバーのボタンクリックイベント
Private Sub TB1_ButtonClick(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) _
Handles TB1.ButtonClick
If e.Button Is tbNew Then : mnNew.PerformClick()
ElseIf e.Button Is tbOpen Then : mnOpen.PerformClick()
ElseIf e.Button Is tbClose Then : mnClose.PerformClick()
ElseIf e.Button Is tbSave Then : mnSave.PerformClick()
ElseIf e.Button Is tbUndo Then : mnUndo.PerformClick()
ElseIf e.Button Is tbCut Then : mnCut.PerformClick()
ElseIf e.Button Is tbCopy Then : mnCopy.PerformClick()
ElseIf e.Button Is tbPaste Then : mnPaste.PerformClick()
ElseIf e.Button Is tbFont Then : mnFont.PerformClick()
ElseIf e.Button Is tbWordwrap Then : mnWordwrap.PerformClick()
End If
End Sub
ボタンの使用状態の可・不可を切り替えるコードです。ここはメインメニューの更新とほぼ同じです。引数に対象となるページを入れて使いますが、ページがないことを想定して変数"bPage"をつくっています。
' UpdateButtonMenus : ボタンメニューの更新
Private Sub UpdateButtonMenus(ByVal page As TextPage)
Dim bPage As Boolean = Not IsNothing(page)
mnEdit.Enabled = bPage
tbClose.Enabled = bPage
tbSave.Enabled = bPage
tbUndo.Enabled = (bPage AndAlso page.EditBox.CanUndo)
tbCut.Enabled = (bPage AndAlso Not page.EditBox.SelectedText.Equals(""))
tbCopy.Enabled = (bPage AndAlso Not page.EditBox.SelectedText.Equals(""))
tbPaste.Enabled = (bPage _
AndAlso (Clipboard.GetDataObject.GetDataPresent(DataFormats.Text) _
OrElse Clipboard.GetDataObject.GetDataPresent(DataFormats.Rtf)))
End Sub
"UpdateButtonMenus"関数をボタンメニューの使用状態の切り替えに影響しそうな関数に挿入します。実際に挿入したのは以下の各関数です。
' Load : ロード
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
...
UpdateButtonMenus(Nothing)
...
End Sub
' タブコントロール : ページの選択イベント
Private Sub TC1_SelectedIndexChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles TC1.SelectedIndexChanged
If TC1.TabPages.Count > 0 Then
...
UpdateButtonMenus(page)
End If
End Sub
' タブコントロール : ページの追加イベント
Private Sub TC1_ControlAdded(ByVal sender As Object, _
ByVal e As ControlEventArgs) Handles TC1.ControlAdded
If TC1.TabPages.Count = 1 Then
...
UpdateButtonMenus(page)
End If
End Sub
' タブコントロール : ページの削除イベント
Private Sub TC1_ControlRemoved(ByVal sender As Object, _
ByVal e As ControlEventArgs) Handles TC1.ControlRemoved
If TC1.TabPages.Count = 1 Then
...
UpdateButtonMenus(Nothing)
End If
End Sub
' タブページ : テキスト状態の変更イベント
Private Sub TextPage_TextStateChanged(ByVal sender As Object, ByVal e As EventArgs)
...
UpdateButtonMenus(DirectCast(ctrEdit.Parent, TextPage))
End Sub
' コンテキストメニュー : 新規作成(既存のページ)
Private Sub pupNew_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles pupNew.Click
If AllowUpdate(clickedpage) Then
...
UpdateButtonMenus(clickedpage)
End If
End Sub
' コンテキストメニュー : 開く (既存のページに)
Private Sub pupOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles pupOpen.Click
If AllowUpdate(clickedpage) Then
...
UpdateButtonMenus(clickedpage)
End If
End Sub