ちょっと間があいてしまいましたが...
MenuStrip って ContextMenuStrip と似てるというか、ほとんど同じ。
おもしろいのが MdiWindowListItem プロパティですかね。
自分で何も実装しなくても、開いている子画面のメニューが勝手にぽこぽこできる。
あと、全然用途がなさそうですが NumericUpDown メニューを作ってみました。
ToolStripControlHost を継承すればサルでも出来てしまうじゃないかと思うくらい簡単。
■参考文献
MenuStrip コントロール (Windows フォーム)
MenuStrip クラス
ToolStripControlHost クラス
■実行画像
MdiWindowListItem に設定したメニュー
Public Class MenuStripTest
Private Sub MenuStripTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' 自身を MDI の親に設定
Me.IsMdiContainer = True
' MenuStrip を追加
Dim mm As MenuStrip = New MenuStrip()
Me.Controls.Add(mm)
Me.MainMenuStrip = mm
Dim mdiWindowListItem As ToolStripMenuItem = New ToolStripMenuItem("MdiWindow")
Dim childShowItem As ToolStripMenuItem = New ToolStripMenuItem("&Open")
mdiWindowListItem.DropDownItems.Add(childShowItem)
AddHandler childShowItem.Click, AddressOf ShowChildForm
Dim testItem As ToolStripMenuItem = New ToolStripMenuItem("test")
' ショートカットキーを使う
testItem.Text = "Test Ctrl+T"
testItem.ShortcutKeys = System.Windows.Forms.Keys.Control Or System.Windows.Forms.Keys.T 'CType(, System.Windows.Forms.Keys)
' ToolTipText を設定する
testItem.ToolTipText = "Open と同じです"
AddHandler testItem.Click, AddressOf ShowChildForm
With mm
.Dock = DockStyle.Top
' Grip を可視にする
.GripStyle = ToolStripGripStyle.Visible
' MDI の子フォームのリストを表示するために使用される ToolStripMenuItem
.MdiWindowListItem = mdiWindowListItem
.Items.Add(mdiWindowListItem)
' 別に MdiWindowListItem にセットしなくとも普通に子画面は開ける
' 開いている Form の一覧が MdiWindowListItem に表示される
.Items.Add(testItem)
' Item に ToolTipText を設定しても、ShowItemToolTips = True じゃないと表示されない
.ShowItemToolTips = True
' プログレスバーを表示してみる
Dim progressBar As ToolStripProgressBar = New ToolStripProgressBar()
progressBar.Minimum = 0
progressBar.Maximum = 100
progressBar.Value = 50
.MdiWindowListItem.DropDownItems.Add(progressBar)
DirectCast(.MdiWindowListItem.DropDown, ToolStripDropDownMenu).ShowCheckMargin = False
End With
'' 独自のアイテムを追加する
Dim originMenu As ToolStripMenuItem = New ToolStripMenuItem()
originMenu.Text = "Original"
mm.Items.Add(originMenu)
Dim numericItem As NumericUpDownItem = New NumericUpDownItem()
originMenu.DropDownItems.Add(numericItem)
End Sub
Private Sub ShowChildForm(ByVal sender As Object, ByVal e As EventArgs)
Dim children As Form = New Form()
children.Text = DateTime.Now.ToString("yyyyMMddHHmmss")
children.MdiParent = Me
children.Size = New Size(100, 100)
children.Show()
End Sub
End Class
' 独自のメニュー項目を作成する
' http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.toolstripcontrolhost(VS.80).aspx
Public Class NumericUpDownItem
Inherits ToolStripControlHost
Public Sub New()
MyBase.New(New NumericUpDown())
End Sub
Public ReadOnly Property NumericUpDown() As NumericUpDown
Get
Return DirectCast(MyBase.Control, NumericUpDown)
End Get
End Property
Public Event ValueChanged As EventHandler
Protected Overrides Sub OnSubscribeControlEvents(ByVal c As Control)
MyBase.OnSubscribeControlEvents(c)
Dim numericUpDownctrl As NumericUpDown = DirectCast(c, NumericUpDown)
' NumericUpDown を生で公開してるから別にやらんでもいいようなきもしますが...
AddHandler numericUpDownctrl.ValueChanged, _
AddressOf OnValueChanged
End Sub
Protected Overrides Sub OnUnsubscribeControlEvents(ByVal c As Control)
MyBase.OnUnsubscribeControlEvents(c)
Dim numericUpDownctrl As NumericUpDown = DirectCast(c, NumericUpDown)
RemoveHandler numericUpDownctrl.ValueChanged, _
AddressOf OnValueChanged
End Sub
Private Sub OnValueChanged(ByVal sender As Object, ByVal e As System.EventArgs)
RaiseEvent ValueChanged(Me, e)
End Sub
End Class