Наша задача научить самостоятельно рисовать пункты меню. Для того, чтобы это стало возможно у нас есть свойство OwnerDraw:
public bool OwnerDraw {get; set;}
Установка его в true говорит о том, что мы сами отвечаем за прорисовку пункты меню. Смотрим пример:
using System; using System.Windows.Forms; using System.Drawing; class MyMenuItem : MenuItem { public MyMenuItem( string text, EventHandler onClick): base(text, onClick) { } protected override void OnDrawItem(DrawItemEventArgs e) { base.OnDrawItem(e); Graphics g = e.Graphics; Rectangle l = e.Bounds; l.Width=l.Width-1; l.Height=l.Height-1; Pen p = new Pen(Color.Blue); g.DrawRectangle(p,l); } protected override void OnMeasureItem(MeasureItemEventArgs e) { base.OnMeasureItem(e); e.ItemHeight = 18; } } class MainForm : Form { MenuItem MenuNew; public MainForm() { Text = "Easy Draw"; MainMenu mnuMenu = new MainMenu(); this.Menu = mnuMenu; MenuItem MenuItemFile = new MenuItem("&File"); MenuNew = new MenuItem("New"); MenuItem MenuOpen = new MenuItem("Open"); MyMenuItem MenuExit = new MyMenuItem("Exit", new System.EventHandler(this.MenuExit_Click)); MenuExit.OwnerDraw=true; MenuItemFile.MenuItems.Add(MenuNew); MenuItemFile.MenuItems.Add(MenuOpen); MenuItemFile.MenuItems.Add(MenuExit); mnuMenu.MenuItems.Add(MenuItemFile); } private void MenuExit_Click(Object sender, EventArgs e) { MessageBox.Show("Exit"); } public static void Main(string[] args) { Application.Run(new MainForm()); } }
Так как мы сами отвечаем за прорисовку меню нам нужно создать свой класс как наследник от MenuItem и в нем перегрузить две функции
protected virtual void OnDrawItem( DrawItemEventArgs e); protected virtual void OnMeasureItem( MeasureItemEventArgs e);
OnDrawItem отвечает за прорисовку элемента меню, а OnMeasureItem за установку размеров. А вот результат: