| netlib.narod.ru | < Назад | Оглавление | Далее > |
Теперь вы знаете достаточно для того, чтобы создать свое первое меню. Этих знаний, конечно, маловато для того, чтобы сделать пункты меню полезными, скажем, выводить диалоговые окна или работать с буфером обмена, но у нас все впереди. В этой программе обработчики события Click просто выводят сообщения с информацией о выбранном пункте меню.
FirstMainMenu.cs
//----------------------------------------------
// FirstMainMenu.cs (C) 2001 by Charles Petzold
//----------------------------------------------
using System;
using System.Drawing;
using System.Windows.Forms;
class FirstMainMenu: Form
{
public static void Main()
{
Application.Run(new FirstMainMenu());
}
public FirstMainMenu()
{
Text = "First Main Menu";
// Пункты подменю File
MenuItem miOpen = new MenuItem("&Open...",
new EventHandler(MenuFileOpenOnClick),
Shortcut.CtrlO);
MenuItem miSave = new MenuItem("&Save",
new EventHandler(MenuFileSaveOnClick),
Shortcut.CtrlS);
MenuItem miSaveAs = new MenuItem("Save &As...",
new EventHandler(MenuFileSaveAsOnClick));
MenuItem miDash = new MenuItem("-");
MenuItem miExit = new MenuItem("E&xit",
new EventHandler(MenuFileExitOnClick));
// Пункт File
MenuItem miFile = new MenuItem("&File",
new MenuItem[] {miOpen, miSave, miSaveAs,
miDash, miExit });
// Пункты подменю Edit
MenuItem miCut = new MenuItem("Cu&t",
new EventHandler(MenuEditCutOnClick),
Shortcut.CtrlX);
MenuItem miCopy = new MenuItem("&Copy",
new EventHandler(MenuEditCopyOnClick),
Shortcut.CtrlC);
MenuItem miPaste = new MenuItem("&Paste",
new EventHandler(MenuEditPasteOnClick),
Shortcut.CtrlV);
// Пункт Edit
MenuItem miEdit = new MenuItem("&Edit",
new MenuItem[] {miCut, miCopy, miPaste});
// Пункты подменю Help
MenuItem miAbout = new MenuItem("&About FirstMainMenu...",
new EventHandler(MenuHelpAboutOnClick));
// Пункт Help
MenuItem miHelp = new MenuItem("&Help",
new MenuItem[] {miAbout});
// Главное меню
Menu = new MainMenu(new MenuItem[] {miFile, miEdit, miHelp});
}
void MenuFileOpenOnClick(object obj, EventArgs ea)
{
MessageBox.Show("File Open item clicked!", Text);
}
void MenuFileSaveOnClick(object obj, EventArgs ea)
{
MessageBox.Show("File Save item clicked!", Text);
}
void MenuFileSaveAsOnClick(object obj, EventArgs ea)
{
MessageBox.Show("File Save As item clicked!", Text);
}
void MenuFileExitOnClick(object obj, EventArgs ea)
{
Close();
}
void MenuEditCutOnClick(object obj, EventArgs ea)
{
MessageBox.Show("Edit Cut item clicked!", Text);
}
void MenuEditCopyOnClick(object obj, EventArgs ea)
{
MessageBox.Show("Edit Copy item clicked!", Text);
}
void MenuEditPasteOnClick(object obj, EventArgs ea)
{
MessageBox.Show("Edit Paste item clicked!", Text);
}
void MenuHelpAboutOnClick(object obj, EventArgs ea)
{
MessageBox.Show(Text + " © 2001 by Charles Petzold");
}
}
Согласен, для программы, просто выводящей несколько сообщений, кода многовато. Но если учесть всю важность меню для большинства приложений, количество кода не кажется несусветным. Большинство действий программы выполняют в ответ на события Click меню.
В программе демонстрируются четыре конструктора MenuItem, Для пункта меню Open из меню File применяется конструктор с тремя параметрами:
MenuItem miOpen = new MenuItem("&Open...",
new EventHandler(MenuFileOpenOnClick),
Shortcut.CtrlO);
Пункт Save As из меню File обычно не имеет быстрой клавиши, поэтому конструктору передаются только два параметра:
MenuItem miSaveAs = new MenuItem("Save &As...",
new EventHandler(MenuFLleSaveAsOnClick));
А вот конструктор только с одним строковым параметром:
MenuItem miDash = new Menultem("-");
При указании прочерка в качестве пункта подменю, в подменю рисуется горизонтальная линия. Таким образом можно разделять группы пунктов в подменю.
После того, как созданы все пункты подменю File, создается пункт меню верхнего уровня, используя еще одну форму конструктора MenuItem:
MenuItem miFile = new MenuItem("&File",
new Menultem[] {miOpen, miSave, miSaveAs,
miDash, miExit });
Конструктору передается текст пункта меню (File) и массив пунктов, появляющихся при вызове подменю.
Далее все то же самое делается для пункта меню Edit (включая подменю, содержащее Cut, Copy и Paste) и Help (содержащего только пункт About). И, наконец, конструктор формы записывает в свойство Menu формы объект типа MainMenu. В конструкторе MainMenu указан массив объектов MenuItem, появляющихся на верхнем уровне меню:
Menu = new MainMenu(new MenuItem[] {miFile, miEdit, miHelp});
В программе FirstMainMenu все обработчики события Click, кроме обработчика события для пункта Exit из меню File, выводят сообщения. Обработчик для пункта Exit вызывает метод Close класса Form и закрывает форму, прекращая выполнение программы.
Не обязательно устанавливать разные обработчики события для каждого события Click. Можно обрабатывать все пункты меню в одном обработчике. Но при использовании разных обработчиков программа становится читабельнее, кроме того, такую программу легче сопровождать. Обрабатывать несколько пунктов меню в одном обработчике события Click имеет смысл, только если они составляют некую связанную группу, обычно представляя взаимоисключающие варианты.
| netlib.narod.ru | < Назад | Оглавление | Далее > |