ファイルメニューの実装といっても、ほとんど前回つくった関数へ渡すだけです。すべてアクティブなページが対象です。
ところで、タブページを閉じる時、テキスト部分にフォーカスがあると、なぜか閉じないことがあります。タブページを削除する前にタブコントロールにフォーカスを移してやるといいようです。
' ファイルメニュー : 新規作成
Private Sub mnNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles mnNew.Click
PageFromFile(Nothing, Nothing)
End Sub
' ファイルメニュー : 開く
Private Sub mnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles mnOpen.Click
Try
PageFromFile("", Nothing)
Catch ex As Exception
MessageBox.Show(ex.Message, "I/Oエラー", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
' ファイルメニュー : 閉じる
Private Sub mnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles mnClose.Click
Dim page As TabPage = TC1.SelectedTab
If (Not IsNothing(page)) AndAlso AllowUpdate(DirectCast(page, TextPage)) Then
TC1.Select()
TC1.TabPages.Remove(page)
End If
End Sub
' ファイルメニュー : 上書き保存
Private Sub mnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles mnSave.Click
Dim page As TextPage = DirectCast(TC1.SelectedTab, TextPage)
PageToFile(page.EditBox.PathName, page)
End Sub
' ファイルメニュー : 名前をつけて保存
Private Sub mnSaveAs_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles mnSaveAs.Click
Dim page As TextPage = DirectCast(TC1.SelectedTab, TextPage)
PageToFile(Nothing, page)
End Sub
' ファイルメニュー : プロパティ
Private Sub mnProperty_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles mnProperty.Click
DirectCast(TC1.SelectedTab, TextPage).EditBox.ShowFileProperty()
End Sub
' ファイルメニュー : 終了
Private Sub mnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles mnExit.Click
Me.Close()
End Sub
以下は"最近使ったファイル"をクリックした時の関数です。第6回に設定して中身が空のままになっていたものです。開く前にファイル名のチェックを行っています。
' mnFileName : 最近使ったファイルを開く
Private Sub mnFileName_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim nIndex As Integer = DirectCast(sender, MenuItem).Index
If IO.File.Exists(m_recent(nIndex)) Then
PageFromFile(m_recent(nIndex), Nothing)
Else
MessageBox.Show( _
"ファイル [" & m_recent(nIndex) & "] は、見つかりませんでした。", _
"読み込みエラー", _
MessageBoxButtons.OK, _
MessageBoxIcon.Error)
End If
End Sub
Selectイベントを使って、各メニュー項目の使用状態を切り替えます。主に、アクティブなタブページがないときに、メニューが使えないようにしています。
' ファイルメニュー : メニュー項目の保守
Private Sub mnFile_Select(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnFile.Select
Dim p As TextPage = DirectCast(TC1.SelectedTab, TextPage)
mnClose.Enabled = Not IsNothing(p)
mnSaveAs.Enabled = Not IsNothing(p)
mnPreview.Enabled = Not IsNothing(p)
mnPrint.Enabled = Not IsNothing(p)
mnRecent.Enabled = Not m_recent.Count.Equals(0)
mnSave.Enabled = ((Not IsNothing(p)) AndAlso p.EditBox.Modified)
mnProperty.Enabled = (Not IsNothing(p)) AndAlso (p.EditBox.PathName <> "")
End Sub
タブウコントロール"TC1"に設定したコンテキストメニュー"PUP1"は、アクティブなページではなく、クリックしたページに対するファイルメニューの役割を果たします。そのため、クリックしたページを特定する必要があります。これはタブコントロールのマウスダウンイベントで処理します。それぞれのタブの部分は"GetTabRect"で位置を取得できますので、マウスの位置がどのタブの範囲にあるかを調べれば特定できます。
' 変数 : クリックされたページ
Private m_clickedpage As TabPage = Nothing
' タブコントロール : マウスダウンイベント
Private Sub TC1_MouseDown(ByVal sender As Object, ByVal e As _
System.Windows.Forms.MouseEventArgs) Handles TC1.MouseDown
' マウス下のページの取得
If TC1.TabPages.Count > 0 Then
Dim i As Integer
Dim r As Rectangle
For i = 0 To TC1.TabPages.Count - 1
r = TC1.GetTabRect(i)
If (e.X >= r.Left _
AndAlso e.X <= r.Right _
AndAlso e.Y >= r.Top _
AndAlso e.Y <= r.Bottom) Then
m_clickedpage = TC1.TabPages(i)
End If
Next
End If
End Sub

クリックしたページ"m_clickedpage"には未保存の文書が存在することがありえますので、以前つくった"AllowUpdate"でチェックしています。
' コンテキストメニュー : 閉じる
Private Sub pupClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles pupClose.Click
If Not IsNothing(m_clickedpage) Then
If m_clickedpage Is TC1.SelectedTab Then
mnClose.PerformClick()
Else
If AllowUpdate(DirectCast(m_clickedpage, TextPage)) Then
Dim page As TabPage = TC1.SelectedTab
TC1.Select()
TC1.TabPages.Remove(m_clickedpage)
TC1.SelectedTab = page
End If
End If
End If
End Sub
' コンテキストメニュー : 新規作成(既存のページ)
Private Sub pupNew_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles pupNew.Click
Dim clickedpage As TextPage = DirectCast(m_clickedpage, TextPage)
If AllowUpdate(clickedpage) Then
PageFromFile(Nothing, clickedpage)
End If
End Sub
' コンテキストメニュー : 開く (既存のページに)
Private Sub pupOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles pupOpen.Click
Dim clickedpage As TextPage = DirectCast(m_clickedpage, TextPage)
If AllowUpdate(clickedpage) Then
PageFromFile("", clickedpage)
End If
End Sub
' コンテキストメニュー : 保存
Private Sub pupSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles pupSave.Click
Dim page As TextPage = DirectCast(m_clickedpage, TextPage)
PageToFile(page.EditBox.PathName, page)
End Sub