Это может полностью нарисовать MenuItem?

Я создал свой элемент управления, который может перерисовывать все MenuItem в форме с помощью MenuItem DrawItem() и MeasureItem(). После того, как я запустил программу, MenuItem перерисовывается, как я и ожидал, но что-то меня беспокоит, что MenuItem не полностью нарисован (оставьте немного пробела), как это

Мое приложение с пользовательским элементом меню DrawItem() Мое приложение с пользовательским элементом меню DrawItem()

как на картинке, есть небольшое белое пространство, которое не нарисовано, может ли оно быть полным, не оставляя пробелов, как это

Контекстное меню AIMP3 Контекстное меню AIMP3

в C#? если да, то какие методы я должен использовать?

это часть моего кода

        public static void RenderMenu(Object sender, DrawItemEventArgs e, Boolean isUseKeyboardAccelerator, Image image)
        {
            Boolean selected = ( e.State & DrawItemState.Selected ) == DrawItemState.Selected;

            e.Graphics.FillRectangle(StyleBrush.Menu, 0, 0, e.Bounds.Width, e.Bounds.Height);

            if ( selected )
                e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds);

            if ( ( (MenuItem)sender ).Text == "-" )
            {
                Int32 vCenter = e.Bounds.Top + ( e.Bounds.Height / 2 ) - 1;

                e.Graphics.DrawLine(SystemPens.ControlDark, e.Bounds.Left + 1, vCenter, ( e.Bounds.Left + e.Bounds.Width - 2 ), vCenter);
                e.Graphics.DrawLine(SystemPens.ControlLightLight, e.Bounds.Left + 1, vCenter + 1, ( e.Bounds.Left + e.Bounds.Width - 2 ), vCenter + 1);
            }
            else
            {
                RenderString(sender, e, selected, isUseKeyboardAccelerator);

                if ( ( (MenuItem)sender ).Checked )
                {
                    MenuGlyph menuGlyph;

                    if ( ( (MenuItem)sender ).RadioCheck )
                        menuGlyph = MenuGlyph.Bullet;
                    else
                        menuGlyph = MenuGlyph.Checkmark;

                    ControlPaint.DrawMenuGlyph(e.Graphics,
                        e.Bounds.Left + ( StyleVariable.MarginLeft + StyleVariable.GlyphBackgroundWidth + StyleVariable.MarginRight - SystemInformation.MenuCheckSize.Width ) / 2,
                        e.Bounds.Top + ( e.Bounds.Height - SystemInformation.MenuCheckSize.Height ) / 2 + 1,
                        SystemInformation.MenuCheckSize.Width, SystemInformation.MenuCheckSize.Height, menuGlyph,
                        selected ? SystemColors.HighlightText : SystemColors.MenuText,
                        selected ? SystemColors.Highlight : SystemColors.Menu);
                }
                else
                {
                    if ( image != null )
                    {
                        if ( ( (MenuItem)sender ).Enabled )
                            e.Graphics.DrawImage(image, e.Bounds.Left + StyleVariable.MarginLeft, e.Bounds.Top + ( ( e.Bounds.Height - StyleVariable.GlyphBackgroundHeight ) / 2 ), StyleVariable.GlyphBackgroundWidth, StyleVariable.GlyphBackgroundHeight);
                        else
                            ControlPaint.DrawImageDisabled(e.Graphics, image, e.Bounds.Left + StyleVariable.MarginLeft, e.Bounds.Top + ( ( e.Bounds.Height - StyleVariable.GlyphBackgroundHeight ) / 2 ), SystemColors.Menu);
                    }
                }
            }
        }

person deanrihpee    schedule 02.07.2015    source источник
comment
Похоже, вы не принимаете во внимание какие-либо отступы над или под пунктом меню, поэтому он выглядит коротким. Если вы говорите о границе, то вам нужно установить цвет фона самого меню, я думаю, из вашего вопроса сложно понять, о чем именно вы спрашиваете.   -  person Ron Beyer    schedule 02.07.2015
comment
MenuItem не имеет padding или margin, и этот пробел недоступен в коде, и метод DrawBackground() делает то же самое, что и FillRectangle, и все еще оставляя белое пространство.   -  person deanrihpee    schedule 02.07.2015
comment
То, что вы видите, является фоном меню, а не пункта меню, поэтому вы не можете решить эту проблему в коде отрисовки пункта меню...   -  person Ron Beyer    schedule 02.07.2015
comment
тогда есть ли способ перерисовать фон Menu?   -  person deanrihpee    schedule 02.07.2015
comment
1) Нет, это не похоже на фон меню. 2) вокруг пунктов меню нет пробелов, только вокруг всего блока. Если у вас их несколько, вы можете видеть, что они представляют собой один непрерывный блок. - Взгляните на этот пост!! Например, ответом является ToolStripProfessionalRenderer.   -  person TaW    schedule 02.07.2015
comment
@TaW этот метод можно использовать для MenuItem, а не для семейства ToolStrip?   -  person deanrihpee    schedule 02.07.2015
comment
Хм, возможно, ты здесь. Может быть, вы хотите проверить, делает ли он то, что вы хотите для ToolStripItems, и, если это так, переключается ..?   -  person TaW    schedule 02.07.2015
comment
ага, почему-то/если полная перерисовка MainMenu/MenuItem не реально, перейду на ToolStripItem   -  person deanrihpee    schedule 02.07.2015