Как добавить информативный текст в разделитель полос меню в vb.net или C # - PullRequest
2 голосов
/ 07 февраля 2012

В форме окна. Я хочу добавить информативный текст в разделитель меню. Кто-нибудь может подсказать, как это сделать? например разделитель должен выглядеть как ниже

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

После многих попыток я могу добавить только простой разделитель. Любая помощь будет отличной

Ответы [ 4 ]

3 голосов
/ 07 февраля 2012

Вы можете создать свой собственный разделитель меню

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.Безуспешно.Происходит какая-то магия, которая препятствует появлению нарисованных владельцем объектов.


РЕДАКТИРОВАТЬ :

Наконец, после некоторых исследований и множества проб и ошибок янашел более удовлетворительное решение.Вот как будет выглядеть результат

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
1 голос
/ 07 июля 2014

Мне нужно было создать на C # реализацию решения Оливье Жако-Дескомба, так что здесь, на случай, если кому-то еще это понадобится. В моем случае мне это нужно было для ContextMenuStrip, а не MenuStrip, но оно работает точно так же, единственное отличие - это имя, которое я использовал.

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);
            }
        }

    }
}
1 голос
/ 07 февраля 2012

Так что вам не нужен разделитель, вам нужен отключенный пункт меню!

0 голосов
/ 07 февраля 2012

Я не думаю, что это возможно.Во всяком случае, не со встроенным меню.Я не знаю, есть ли 3-й элемент управления, который вы могли бы использовать для этого.Если вам это нужно, просто сделайте заголовок, как показано в вашем вопросе.Только не пишите код для любого события этого menustripitem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...