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