2012-02-07 13 views
2

ウィンドウ形式。メニューセパレータに情報テキストを追加したい。誰もそれを行う方法を提案することはできますか?例えば、セパレータ用 は、私だけの単純な区切りを追加することができる午前試みの多くの後vb.netまたはC#のメニューストリップ区切り記号に情報テキストを追加する方法

Menu Item1 
Menu Item2 
----- Separator title ----- 
Menu Item3 
Menu Item4 

以下のように表示されます。どんな助けになるでしょうか

+0

これは一般的に受け入れられるものではないため、お客様を驚かせることがあります。 –

答えて

1

セパレータは必要ありませんので、無効にしたメニュー項目が必要です。

0

私は考えられません。とにかく組み込みのmenustripではありません。私はあなたがこれに使うことができる3つの部分のコントロールがあるかどうかわかりません。 必要がある場合は、質問に表示されているタイトルを作成してください。そのmenustripitemのイベントのコードを書かないでください。

3

あなたはそれが同じプロジェクトで定義されている場合には、自動的に「挿入」コンテキストメニューに表示されます

Public Class TextToolStripSeparator 
    Inherits ToolStripMenuItem 

    Public Overrides ReadOnly Property CanSelect() As Boolean 
     Get 
      Return DesignMode 
     End Get 
    End Property 

    Public Overrides Property Text() As String 
     Get 
      Return MyBase.Text 
     End Get 
     Set 
      value = value.Trim("-"C, " "C) 
      MyBase.Text = "---- " & value & " -------" 
     End Set 
    End Property 
End Class 

独自のメニューセパレータを作成することができます。


また、OnPaintメソッドを上書きしようとしました。成功なし。所有者が描画したオブジェクトが表示されないようにする魔法があります。


EDITは:

最後に、いくつかの研究と試行錯誤の多くの後、私はより満足解決策を見つけました。これは、結果は

enter image description here

まず、我々は我々自身のツールストリップの区切りクラスを作成どのように見えるかです。

Public Class TextToolStripSeparator 
    Inherits ToolStripMenuItem 

    Public Overrides ReadOnly Property CanSelect() As Boolean 
     Get 
      Return DesignMode 
     End Get 
    End Property 

    Public Overrides ReadOnly Property HasDropDownItems() As Boolean 
     Get 
      Return False 
     End Get 
    End Property 
End Class 

ご覧のとおり、非常に簡単です。より複雑な部分は私たち自身のMenuStripクラスに入ります。ここでは、カスタマイズされたToolStripRendererを提供しています。

Public Class MenuStripEx 
    Inherits MenuStrip 

    Public Sub New() 
     Me.Renderer = New ToolStripRendererEx() 
    End Sub 

    Private Class ToolStripRendererEx 
     Inherits ToolStripProfessionalRenderer 

     Protected Overrides Sub OnRenderItemText(e As ToolStripItemTextRenderEventArgs) 
      Const flags As TextFormatFlags = TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter 

      Dim item As ToolStripItem = e.Item 
      If TypeOf item Is TextToolStripSeparator Then 
       Dim textWidth As Integer = TextRenderer.MeasureText(item.Text, item.Font).Width 
       Dim rect As Rectangle = e.TextRectangle 
       rect.Width = e.ToolStrip.Width - rect.Left - 3 
       TextRenderer.DrawText(e.Graphics, item.Text, item.Font, rect, Color.DimGray, flags) 

       Dim y As Integer = rect.Y + rect.Height \ 2 
       Dim margin As Integer = (rect.Width - textWidth) \ 2 
       e.Graphics.DrawLine(Pens.DarkGray, rect.X, y, rect.X + margin, y) 
       e.Graphics.DrawLine(Pens.DarkGray, rect.Right - margin, y, rect.Right, y) 
      Else 
       MyBase.OnRenderItemText(e) 
      End If 
     End Sub 
    End Class 
End Class 
+0

最後にVB版があります。最初にC#のバージョンを提供して申し訳ありません。私はあなたのVBタグを見ませんでした。 –

+0

ありがとうございます。私はC#の実装が必要でしたので、誰かがそれを必要とする場合に備えて、以下のものを追加しました。 –

+0

これは動的コンテキストメニューでも機能しますか?私は試みましたが、私はこれをどのように実装するか考えていません。いくつかの使用例を提供できますか? – user1500403

1

私は他の誰がそれを必要とする場合にはそうここにある、オリヴィエJacot-DescombesのソリューションのC#実装を作成する必要がありました。私の場合、私はMenuStripではなくContextMenuStripのためにそれを必要としましたが、それは全く同じですが、唯一の違いは私が使った名前です。

public class TextToolStripSeparator : ToolStripMenuItem 
{ 
    public override bool CanSelect { get { return DesignMode; } } 

    public override bool HasDropDownItems { get { return false; } } 
} 

public class ContextMenuStripEx : ContextMenuStrip 
{ 
    public ContextMenuStripEx() 
    { 
     this.Renderer = new ToolStripRendererEx(); 
    } 

    private class ToolStripRendererEx : ToolStripProfessionalRenderer 
    { 
     protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) 
     { 
      const TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter; 

      ToolStripItem item = e.Item; 

      if (item is TextToolStripSeparator) 
      { 
       int textWidth = TextRenderer.MeasureText(item.Text, item.Font).Width; 
       Rectangle rect = e.TextRectangle; 
       rect.Width = e.ToolStrip.Width - rect.Left; 
       TextRenderer.DrawText(e.Graphics, item.Text, item.Font, rect, Color.DimGray, flags); 

       int y = rect.Y + rect.Height/2; 
       int margin = (rect.Width - textWidth)/2; 
       e.Graphics.DrawLine(Pens.DarkGray, rect.X, y, rect.X + margin, y); 
       e.Graphics.DrawLine(Pens.DarkGray, rect.Right - margin, y, rect.Right, y); 
      } 
      else 
      { 
       base.OnRenderItemText(e); 
      } 
     } 

    } 
} 
関連する問題