Шаг 172 - Меню и классы

Итак, есть некоторая задача по созданию векторного редактора. Он у нас должен рисовать три объекта - точка, линия, площадь. Почему три ? Читайте "Шаг 2 - Элементы электронной карты". Этого вполне достаточно для любого рисунка. Создаем меню, трудного сделать ничего нет.

gif/172_1.gif (2665 b)

// CSharp DotNet Sample Code
//........
public void MenuInitial()
{
	MainMenu mnuMenu = new MainMenu();
	MenuItem menuFile = new MenuItem("File");
	MenuItem menuExit = new MenuItem("Exit",
		new System.EventHandler(this.MenuExit_Click));
	menuFile.MenuItems.Add(menuExit);
	MenuItem menuEdit = new MenuItem("Edit");
	MenuItem menuDrawLine = new MenuItem("Draw Line",
		new System.EventHandler(this.MenuDrawLine_Click));
	MenuItem menuDrawPoligon = new MenuItem("Draw Poligon",
		new System.EventHandler(this.MenuDrawPoligon_Click));
	MenuItem menuDrawPoint = new MenuItem("Draw Point",
		new System.EventHandler(this.MenuDrawPoint_Click));
	menuEdit.MenuItems.Add(menuDrawLine);
	menuEdit.MenuItems.Add(menuDrawPoligon);
	menuEdit.MenuItems.Add(menuDrawPoint);
	mnuMenu.MenuItems.Add(menuFile);
	mnuMenu.MenuItems.Add(menuEdit);
	this.Menu = mnuMenu;
}
//........

И обработчики его естественно:

// CSharp DotNet Sample Code
	
// Выход из программы пункт Exit
private void MenuExit_Click(Object sender, EventArgs e)
{
	Application.Exit();
} 
	
// будем рисовать линию
private void MenuDrawLine_Click(Object sender, EventArgs e)
{}
	
// будем рисовать полигон
private void MenuDrawPoligon_Click(Object sender,EventArgs e)
{}
	
// будем рисовать точку
private void MenuDrawPoint_Click(Object sender,EventArgs e)
{}
	
// мышка нажата
protected override void OnMouseDown(MouseEventArgs e) 
{}

// клавиша нажата
protected override  void OnKeyPress(KeyPressEventArgs e)
{}

Так вот давайте проанализируем, что будет происходить. Человек будет выбирать пункт меню чего будет рисовать. С этого момент программа должна знать, что человек выбрал режим рисования. Очень хорошо. Значит нужно завести глобальную переменную. А после окончания рисования программа опять должна знать, что режим рисования закончен. Итак, давайте сделаем заведем глобальную переменную.

// CSharp DotNet Sample Code
//......
	
class MainForm : Form
{
	// ......
	// будем рисовать линию
	private void MenuDrawLine_Click(Object sender, EventArgs e)
	{
		testDraw=true;
		Cursor=Cursors.Cross;
	}
	
	// будем рисовать полигон
	private void MenuDrawPoligon_Click(Object sender,EventArgs e)
	{
		testDraw=true;
		Cursor=Cursors.Cross;
	}
	
	// будем рисовать точку
	private void MenuDrawPoint_Click(Object sender,EventArgs e)
	{
		testDraw=true;
		Cursor=Cursors.Cross;
	}
	
	// мышка нажата
	protected override void OnMouseDown(MouseEventArgs e) 
	{}

	// клавиша нажата
	protected override void OnKeyPress(KeyPressEventArgs e)
	{
		if (testDraw==true) testDraw=false;
		Cursor=Cursors.Default;
	}

	bool testDraw=false;
}
}

Вроде как все нормально, теперь при выборе пункта меню меняется курсор, а при нажатии клавиши возвращается на свое месте. Но ведь мы не как не отследили что бы пункты меню не выбирались дважды. Пока не закончено рисование пункт меню другого рисования не должен выбираться. Первое желание сделать вот так.

// CSharp DotNet Sample Code
private void MenuDrawPoligon_Click(Object sender,EventArgs e)
{
	if (testDraw==false)
	{
		testDraw=true;
		Cursor=Cursors.Cross;
	}
}

И так во всех обработчиках, но можно пойти и по другому, объявить MenuItem menuEdit глобально в классе и пока не закончено редактирование просто запрещать его выбирать.

// CSharp DotNet Sample Code
// ......
	
class MainForm : Form
{
	// ......
	// будем рисовать линию
	private void MenuDrawLine_Click(Object sender, EventArgs e)
	{
		menuEdit.Enabled=false;
		testDraw=true;
		Cursor=Cursors.Cross;
	}
	
	// будем рисовать полигон
	private void MenuDrawPoligon_Click(Object sender,EventArgs e)
	{
		menuEdit.Enabled=false;
		testDraw=true;
		Cursor=Cursors.Cross;
	}
	
	// будем рисовать точку
	private void MenuDrawPoint_Click(Object sender,EventArgs e)
	{
		menuEdit.Enabled=false;
		testDraw=true;
		Cursor=Cursors.Cross;
	}
	
	// мышка нажата
	protected override void OnMouseDown(MouseEventArgs e) 
	{}

	// клавиша нажата
	protected override void OnKeyPress(KeyPressEventArgs e)
	{
		if (testDraw==true) testDraw=false;
		menuEdit.Enabled=true;
		Cursor=Cursors.Default;
	}

	bool testDraw=false;
	MenuItem menuEdit;
}
}

Полный код в проекте. Теперь все нормально, выбираем пункт меню, и пока не закончим редактировать нажав клавишу нам не разрешат выбрать другой тип для рисования.

gif/172_2.gif (1583 b)

А при чем здесь классы скажете Вы? Не торопитесь, я стараюсь рассказать все последовательно. Все еще впереди.


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