netlib.narod.ru< Назад | Оглавление | Далее >

Нетрадиционные меню

Хотя проектирование меню таким образом, чтобы они были похожи на меню других Windows-программ, помогает пользователю ориентироваться в программе, так делать не обязательно. Иногда — скажем, в программе, которую вы пишете сами для себя, — нужен только один пункт меню. Отобразить тот факт, что пункт меню верхнего уровня не вызывает подменю, а выполняет некоторое действие, можно восклицательным знаком.

Следующая программа, являющаяся подклассом программы JeuDeTaquin из главы 10, содержит меню из одного пункта Scramble!:

JeuDeTaquinWithScramble.cs

  //--------------------------------------------------------
  // JeuDeTaquinWithScramble.cs (C) 2001 by Charles Petzold
  //--------------------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class JeuDeTaquinWithScramble: JeuDeTaquin
  {
      public new static void Main()
      {
          Application.Run(new JeuDeTaquinWithScramble());
      }
      public JeuDeTaquinWithScramble()
      {
          Menu = new MainMenu(new MenuItem[] { 
                    new MenuItem("&Scramble!", 
                         new EventHandler(MenuScrambleOnClick)) });
      }
      void MenuScrambleOnClick(object obj, EventArgs ea)
      {
          Randomize();
      }
  }

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

Одной из первых популярных программ, использующей визуальное иерархическое меню в текстовом режиме MS-DOS, была Lotus 1-2-3. Однако меню Lotus 1-2-3 не содержали всплывающих меню. Меню выводились в одной строке, и каждый следующий уровень меню заменял предыдущий.

В программе Windows Forms можно реализовать такое поведение, определив несколько объектов MainMenu и динамически присваивая эти объекты свойству Menu формы. Этот подход демонстрируется в следующей программе.

OldFashionedMenu.cs

  //-------------------------------------------------
  // OldFashionedMenu.cs (C) 2001 by Charles Petzold
  //-------------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class OldFashionedMenu: Form
  {
      MainMenu mmMain, mmFile, mmEdit;

      public static void Main()
      {
          Application.Run(new OldFashionedMenu());
      }
      public OldFashionedMenu()
      {
          Text = "Old-Fashioned Menu";

          EventHandler eh = new EventHandler(MenuOnClick);

          mmMain = new MainMenu(new MenuItem[] 
          { 
              new MenuItem("MAIN:"),
              new MenuItem("&File", new EventHandler(MenuFileOnClick)),
              new MenuItem("&Edit", new EventHandler(MenuEditOnClick))
          });

          mmFile = new MainMenu(new MenuItem[]
          {
              new MenuItem("FILE:"),
              new MenuItem("&New", eh),
              new MenuItem("&Open...", eh),
              new MenuItem("&Save", eh),
              new MenuItem("Save &As...", eh),
              new MenuItem("(&Main)", new EventHandler(MenuMainOnClick))
          });
          
          mmEdit = new MainMenu(new MenuItem[]
          {
              new MenuItem("EDIT:"),
              new MenuItem("Cu&t", eh),
              new MenuItem("&Copy", eh),
              new MenuItem("&Paste", eh),
              new MenuItem("De&lete", eh),
              new MenuItem("(&Main)", new EventHandler(MenuMainOnClick))
          });

          Menu = mmMain;
      }
      void MenuMainOnClick(object obj, EventArgs ea)
      {
          Menu = mmMain;
      }
      void MenuFileOnClick(object obj, EventArgs ea)
      {
          Menu = mmFile;
      }
      void MenuEditOnClick(object obj, EventArgs ea)
      {
          Menu = mmEdit;
      }
      void MenuOnClick(object obj, EventArgs ea)
      {
          MessageBox.Show("Menu item clicked!", Text);
      }
  }

netlib.narod.ru< Назад | Оглавление | Далее >

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