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

Работа с контекстными меню

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

ContextMenuDemo.cs

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

  class ContextMenuDemo: Form
  {
      MenuItem miColor;

      public static void Main()
      {
          Application.Run(new ContextMenuDemo());
      }
      public ContextMenuDemo()
      {
          Text = "Context Menu Demo";

          EventHandler eh = new EventHandler(MenuColorOnClick);

          MenuItem[] ami = { new MenuItem("Black",   eh),
                             new MenuItem("Blue",    eh),
                             new MenuItem("Green",   eh),
                             new MenuItem("Cyan",    eh),
                             new MenuItem("Red",     eh),
                             new MenuItem("Magenta", eh),
                             new MenuItem("Yellow",  eh),
                             new MenuItem("White",   eh) };

          foreach (MenuItem mi in ami)
              mi.RadioCheck = true;

          miColor = ami[3];
          miColor.Checked = true;
          BackColor = Color.FromName(miColor.Text);

          ContextMenu = new ContextMenu(ami);
      }
      void MenuColorOnClick(object obj, EventArgs ea)
      {
          miColor.Checked = false;
          miColor = (MenuItem) obj;
          miColor.Checked = true;

          BackColor = Color.FromName(miColor.Text);
      }
  }

В этой программе 8 пунктов меню определяются прямо при инициализации массива ami типа MenuItem. Как и в предыдущей программе, все пункты связаны с одним обработчиком события Click. В цикле for свойство RadioCheck для каждого пункта устанавливается в true. Затем конструктор присваивает переменной miColor значение четвертого элемента массива, задает отметку для этого пункта и устанавливает цвет фона в соответствии с отмеченным пунктом.

Конструктор завершается созданием нового объекта ContextMenu из массива объектов MenuItem и присваиванием этого объекта свойству ContextMenu формы:

   ContextMenu = new ContextMenu(ami);

Контекстное меню можно вызвать, щелкнув правой кнопкой в любом месте клиентской области. Кроме того, класс ContextMenu содержит метод, позволяющий вывести контекстное меню, не задавая свойство элемента управления ContextMenu:


Методы ContextMenu (выборочно)



void Show(Control ctrl, Point ptLocation)


Этот метод можно использовать, если нужно выводить разные контекстные меню в зависимости от того, в каком месте элемента управления (или формы) пользователь щелкнул мышью.

С точки зрения преобразования текста пункта меню в цвет, программа ContextMenuDemo не отличается от CheckAndRadioCheck. При реализации взаимоисключающих пунктов меню, связанных с одним и тем же обработчиком, гораздо правильнее использовать в меню свой класс-наследник MenuItem. Он включает новое поле или свойство, в котором хранится связанный с этим пунктом объект.

В следующей программе класс MenuItemColor является наследником MenuItem. Класс содержит закрытое поле clr, в котором хранится объект Color. Открытое свойство Color позволяет другим классам обращаться к этому цвету. Кроме того, новый класс содержит новый конструктор, позволяющий создать объект MenuItemColor с определенным цветом. Эта программа похожа на ContextMenuDemo за исключением того, что в ней вместо MenuItem используется MenuItemColor.

BetterContextMenu.cs

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

  class BetterContextMenu: Form
  {
      MenuItemColor micColor;

      public static void Main()
      {
          Application.Run(new BetterContextMenu());
      }
      public BetterContextMenu()
      {
          Text = "Better Context Menu Demo";

          EventHandler eh = new EventHandler(MenuColorOnClick);

          MenuItemColor[] amic = 
          {
              new MenuItemColor(Color.Black,   "&Black",  eh),
              new MenuItemColor(Color.Blue,    "B&lue",   eh),
              new MenuItemColor(Color.Green,   "&Green",   eh),
              new MenuItemColor(Color.Cyan,    "&Cyan",    eh),
              new MenuItemColor(Color.Red,     "&Red",     eh),
              new MenuItemColor(Color.Magenta, "&Magenta", eh),
              new MenuItemColor(Color.Yellow,  "&Yellow",  eh),
              new MenuItemColor(Color.White,   "&White",   eh)
          };

          foreach (MenuItemColor mic in amic)
              mic.RadioCheck = true;

          micColor = amic[3];
          micColor.Checked = true;
          BackColor = micColor.Color;

          ContextMenu = new ContextMenu(amic);
      }
      void MenuColorOnClick(object obj, EventArgs ea)
      {
          micColor.Checked = false;
          micColor = (MenuItemColor) obj;
          micColor.Checked = true;

          BackColor = micColor.Color;
      }
  }
  class MenuItemColor: MenuItem
  {
      Color clr;

      public MenuItemColor(Color clr, string str, EventHandler eh):
                                                            base(str, eh)
      {
          Color = clr;
      }
      public Color Color
      {
          get { return clr; }
          set { clr = value; }
      }
  }

Теперь свойству BackColor формы можно присвоить значение свойства Color отмеченного в данный момент объекта MenuItemColor.


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

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