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