0

我需要在 Winform 应用程序中使用 ContextMenu。请注意它必须是 ContextMenu 而不是 ContextMenuStrip。ContextMenu 的问题是我没有看到任何方法或属性来设置字体并在 MenuItem 旁边显示图像/图标,这在 ContextMenuStrip 的情况下很容易。

是否可以在 ContextMenu 的 MenuItem 旁边设置字体并显示图像/图标?

4

1 回答 1

2

默认 ContextMenu 不提供此功能。如果您想要此功能,您应该创建自己的自定义 MenuItem,或者您可以启用项目的OwnerDraw模式并在DrawItem事件处理程序中进行手动绘制:

var item = new MenuItem("foo");
item.OwnerDraw = true;
item.DrawItem += item_DrawItem;

顺便说一句,您还需要处理 MeasureItem 事件以提供您将手动绘制的项目的大小。例如创建斜体字体

void item_MeasureItem(object sender, MeasureItemEventArgs e)
{
    var item = (MenuItem)sender;
    var g = e.Graphics;
    Font font = new Font("Arial", 10, FontStyle.Italic);

    e.ItemWidth = 200;
    var size = g.MeasureString(item.Text, font, e.ItemWidth);
    e.ItemHeight = (int)size.Height;            
}

void item_DrawItem(object sender, DrawItemEventArgs e)
{
    var item = (MenuItem)sender;
    var g = e.Graphics;            
    var font = new Font("Arial", 10, FontStyle.Italic);
    var brush = new SolidBrush(e.ForeColor);
    g.DrawString(item.Text, font, brush, e.Bounds.X, e.Bounds.Y);
}

并添加项目:

ContextMenu = new ContextMenu(new []{new MenuItem("foo"), new MenuItem("bar")});
foreach (MenuItem item in ContextMenu.MenuItems)
{
    item.OwnerDraw = true;
    item.MeasureItem += item_MeasureItem;
    item.DrawItem += item_DrawItem;
}

与自定义 MenuItem 类相同:

public class MenuItemWithItalicFont : MenuItem
{
    private Font font;

    public MenuItemWithItalicFont(string text)
        : base(text)
    {
        OwnerDraw = true;
        font = new Font("Arial", 10, FontStyle.Italic);
    }

    protected override void OnMeasureItem(MeasureItemEventArgs e)
    {
        var g = e.Graphics;
        e.ItemWidth = 200;
        var size = g.MeasureString(Text, font, e.ItemWidth);
        e.ItemHeight = (int)size.Height;
    }

    protected override void OnDrawItem(DrawItemEventArgs e)
    {
        base.OnDrawItem(e);
        var g = e.Graphics;
        var brush = new SolidBrush(e.ForeColor);
        g.DrawString(Text, font, brush, e.Bounds.X, e.Bounds.Y);
    }
}

添加项目:

ContextMenu = new ContextMenu(new []{ 
     new MenuItemWithItalicFont("foo"), 
     new MenuItemWithItalicFont("bar")});

注意实际上 ContextMenu 已被 ContextMenuStrip 控件取代,如果您需要此功能,则应使用新控件。旧的 ContextMenu 仍然存在,主要是为了向后兼容。MSDN

如果您选择,则保留 ContextMenu 以供向后兼容和将来使用。

于 2013-09-30T08:38:30.413 回答