注意:ここで紹介している方法は、.NET Framework 2.0以降でのみ使用できます。
デフォルトでは、ToolStripの幅が狭く、すべてのToolStripItemが表示しきれない時は、ToolStripの一番右にオーバーフローボタンが表示され、そのボタンを押すと表示しきれなくなったToolStripItemが表示されます(詳しくは、「ToolStrip(ツールバー、メニュー、ステータスバー)のオーバーフローを有効にする」をご覧ください)。
ToolStripItemがオーバーフロー状態になったことを知るためのイベントは存在しません。しかし、MSDNの「方法 : Windows フォームの ToolStrip オーバーフローを管理する」によると、ToolStripのLayoutCompletedイベントが発生した時に、ToolStripItem.Placementプロパティの値を調べて、ToolStripItemがオーバーフロー状態か調べることができるということです。
実際のコードは、例えば、次のようになりそうです。ここでは、toolStripButton1のオーバーフロー状態を監視しています。
Private toolStripButton1Placement As ToolStripItemPlacement = _ ToolStripItemPlacement.None 'toolStrip1のLayoutCompletedイベントハンドラ Private Sub toolStrip1_LayoutCompleted( _ ByVal sender As Object, ByVal e As EventArgs) _ Handles ToolStrip1.LayoutCompleted If ToolStripButton1.Placement <> toolStripButton1Placement Then If ToolStripButton1.Placement = ToolStripItemPlacement.Overflow Then Console.WriteLine( _ "toolStripButton1がオーバーフロー状態になりました") Else If ToolStripButton1.Placement = ToolStripItemPlacement.Main Then Console.WriteLine( _ "toolStripButton1がオーバーフロー状態ではなくなりました") End If toolStripButton1Placement = ToolStripButton1.Placement End If End Sub
private ToolStripItemPlacement toolStripButton1Placement = ToolStripItemPlacement.None; //toolStrip1のLayoutCompletedイベントハンドラ private void toolStrip1_LayoutCompleted(object sender, EventArgs e) { if (toolStripButton1.Placement != toolStripButton1Placement) { if (toolStripButton1.Placement == ToolStripItemPlacement.Overflow) { Console.WriteLine( "toolStripButton1がオーバーフロー状態になりました"); } else if (toolStripButton1.Placement == ToolStripItemPlacement.Main) { Console.WriteLine( "toolStripButton1がオーバーフロー状態ではなくなりました"); } toolStripButton1Placement = toolStripButton1.Placement; } }
実際に試してみると分かりますが、toolStripButton1がすでにオーバーフロー状態となっていても、toolStrip1の幅を変えた時に、「オーバーフロー状態になりました」と「オーバーフロー状態ではなくなりました」が連続して表示されることがあります。
補足:ToolStripのオーバーフローボタンの実体は、ToolStripOverflowButtonというToolStripItemであり、ToolStrip.OverflowButtonプロパティで取得することができます。よって、DropDownItemsプロパティで現在オーバーフロー状態となっているすべてのアイテムを取得できそうですが、実際にはできません。しかし、HasDropDownItemsプロパティは使えるようです。
(この記事は、「.NETプログラミング研究」で紹介したものを基にしています。)