Шаг 155 - Самостоятельно рисуем пункты меню

Наша задача научить самостоятельно рисовать пункты меню. Для того, чтобы это стало возможно у нас есть свойство 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 за установку размеров. А вот результат:

gif/155_1.gif (2068 b)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.