2013-09-30 46 views
0

我需要在Winform應用程序中使用ContextMenu。請參閱它需要是ContextMenu而不是ContextMenuStrip。 ContextMenu的問題在於我沒有看到任何方法或屬性來設置字體,並在MenuItem旁邊顯示一個圖像/圖標,在ContextMenuStrip的情況下很容易。Winform contextmenu使用c#

是否可以在ContextMenu中設置字體並在MenuItem旁邊顯示圖像/圖標?

+3

你能解釋爲什麼不使用ContextMenuStrip? – Asaf

+0

@Asaf我更喜歡舊的ContextMenu的外觀和感覺 – jeff

回答

2

默認ContextMenu不提供此功能。如果你想要這個功能,你應該創建自己的自定義菜單項,也可以使項目的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; 
} 

同樣使用自定義菜單項類:

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以保持向後兼容和未來的使用。