ウィンドウ形式。メニューセパレータに情報テキストを追加したい。誰もそれを行う方法を提案することはできますか?例えば、セパレータ用 は、私だけの単純な区切りを追加することができる午前試みの多くの後vb.netまたはC#のメニューストリップ区切り記号に情報テキストを追加する方法
Menu Item1
Menu Item2
----- Separator title -----
Menu Item3
Menu Item4
以下のように表示されます。どんな助けになるでしょうか
ウィンドウ形式。メニューセパレータに情報テキストを追加したい。誰もそれを行う方法を提案することはできますか?例えば、セパレータ用 は、私だけの単純な区切りを追加することができる午前試みの多くの後vb.netまたはC#のメニューストリップ区切り記号に情報テキストを追加する方法
Menu Item1
Menu Item2
----- Separator title -----
Menu Item3
Menu Item4
以下のように表示されます。どんな助けになるでしょうか
セパレータは必要ありませんので、無効にしたメニュー項目が必要です。
私は考えられません。とにかく組み込みのmenustripではありません。私はあなたがこれに使うことができる3つの部分のコントロールがあるかどうかわかりません。 必要がある場合は、質問に表示されているタイトルを作成してください。そのmenustripitemのイベントのコードを書かないでください。
あなたはそれが同じプロジェクトで定義されている場合には、自動的に「挿入」コンテキストメニューに表示されます
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は:
最後に、いくつかの研究と試行錯誤の多くの後、私はより満足解決策を見つけました。これは、結果は
まず、我々は我々自身のツールストリップの区切りクラスを作成どのように見えるかです。
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
最後にVB版があります。最初にC#のバージョンを提供して申し訳ありません。私はあなたのVBタグを見ませんでした。 –
ありがとうございます。私はC#の実装が必要でしたので、誰かがそれを必要とする場合に備えて、以下のものを追加しました。 –
これは動的コンテキストメニューでも機能しますか?私は試みましたが、私はこれをどのように実装するか考えていません。いくつかの使用例を提供できますか? – user1500403
私は他の誰がそれを必要とする場合にはそうここにある、オリヴィエ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);
}
}
}
}
これは一般的に受け入れられるものではないため、お客様を驚かせることがあります。 –