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 | < Назад | Оглавление | Далее > |