Я создал свой элемент управления, который может перерисовывать все MenuItem в форме с помощью MenuItem DrawItem() и MeasureItem(). После того, как я запустил программу, MenuItem перерисовывается, как я и ожидал, но что-то меня беспокоит, что MenuItem не полностью нарисован (оставьте немного пробела), как это Мое приложение с пользовательским элементом меню DrawItem()
как на картинке, есть небольшое белое пространство, которое не нарисовано, может ли оно быть полным, не оставляя пробелов, как это Контекстное меню 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);
}
}
}
}