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

Сайт управляется системой uCoz