Рисующее приложение в версии .NET, страница 12

private void MenuItemHandler(object sender, System.EventArgs e){}

В этой функции будет реализована обработка всех команд главного меню. Альтернативным решением является создание многих функций обработки по одной функции для каждой команды меню. Выбранный способ возможен потому, что первый параметр функции (object sender) несет информацию об идентификаторе активной команды. Введите в функцию обработки следующий код.

private void MenuItemHandler(object sender, System.EventArgs e)

{

if (sender == menuItemNew)

New();

else if (sender == menuItemOpen)

Open();

else if(sender == menuItemClose)

Close();

else if (sender == menuItemSave)

Save();

else if (sender == menuItemSaveAs)

Save();

else if (sender == menuItemPreview)

PrintPreview();

else if (sender == menuItemPrint)

Print();

else if(sender == menuItemExit)

Exit();

}

Здесь приведен фрагмент, который обрабатывает все команды, присутствующие в меню File главного меню. Остальные команды обрабатываются аналогичным способом и в этой же функции. Вы будете добавлять ветви их обработки по мере необходимости. В ветвях условного оператора происходит вызов функций (New, Open и т.д.), которые предстоит создать. Класс Object является суперклассом для всех классов платформы .NET, поэтому ссылки типа object могут содержать адреса объектов любого класса, в том числе и класса MenuItem. Сравнивая ссылки (sender == menuItemNew), мы фактически сравниваем адреса объектов.

Рассматривая код, возникает желание переписать его с использованием оператора switch. К сожалению, это невозможно — коипилятор сообщит нам, что параметром оператора switch должно быть значение интегрального типа. В документе под названием C# Programmers Reference вы найдете более точное определение. Там сказано, что выражение в скобках может быть "an integral or string type expression". Поэтому в программе на C# (в отличие от С++) возможен фрагмент вида:

string[] ss = { "One","Two", "Three" };

string s = ss[0];

switch(s)

{

case "One":  // Do something

break;

case "Two":// Do something

break;

}

Возвращаясь к кодам MenuItemHandler, отметим, что ссылки object не подходят под указанное, расширенное определение, поэтому оператор switch использовать прямым способом не удастся. Теперь введем в состав класса MainWindow функцию, которая непосредственно займется обработкой команды File4New.

private void New()

{

if (ActiveMdiChild == null)

EnableItems();

CreateDocument();

}

В жизни MDI-приложения бывают моменты, когда клиентская область главного окна пуста. Им соответствует нулевое значение свойства ActiveMdiChild, которое в другие моменты позволяет получить (get) ссылку на активное child-окно. В моменты, когда клиентская область пуста, многие команды меню и кнопки на панели инструментов должны быть либо скрыты, либо недоступны. Создание нового документа в один из таких моментов означает переход в качественно другое состояние. При этом необходимо вновь оживить (сделать доступными) команды и кнопки. Мы сделаем это в функции EnableItems, вызов которой вы видите внутри функции New. Введите в состав класса MainWindow новый метод.

public void EnableItems()

{

menuItemEdit.Visible = true;

menuItemPenColor.Visible = true;

menuItemWindow.Visible = true;

menuItemClose.Visible = true;

menuItemSave.Visible = true;

menuItemSaveAs.Visible = true;

menuItemPrint.Visible = true;

menuItemPreview.Visible = true;

toolBarButtonSave.Enabled = true;

toolBarButtonPreview.Enabled = true;

toolBarButtonPrint.Enabled = true;

}

Логика приложения требует создать еще одну, симметричную функцию, которая скрывает или обездвиживает команды и кнопки.

public void DisableItems()

{

menuItemEdit.Visible = false;

menuItemPenColor.Visible = false;

menuItemWindow.Visible = false;

menuItemClose.Visible = false;

menuItemSave.Visible = false;

menuItemSaveAs.Visible = false;

menuItemPrint.Visible = false;

menuItemPreview.Visible = false;

toolBarButtonSave.Enabled = false;

toolBarButtonPreview.Enabled = false;

toolBarButtonPrint.Enabled = false;

}