netlib.narod.ru | < Назад | Оглавление | Далее > |
В Windows Forms меню, находящееся между заголовком формы и клиентской областью, называется главным меню формы. Кроме того, во многих приложениях используются меню быстрого вызова, или контекстные меню, появляющиеся под курсором при нажатии правой кнопки мыши. Главное меню связано с формой, а контекстное — обычно с конкретным элементом управления, т.е. щелчки по разным элементам управления могут вызывать разные контекстные меню.
Любое меню (как главное, так и контекстное) содержит пункты меню. Пункт меню обычно связан со словом или короткой фразой: File (Файл), Open (Открыть), Save (Сохранить), Save As (Сохранить как), Edit (Правка), Cut (Вырезать), Сoру (Копировать), Paste (Вставить) или Select All (Выделить все) и т.п. Далее я часто буду ссылаться на пункт меню по связанному с ним тексту.
Скорее всего вы слегка удивлены. Как же так, ведь пункты File и Edit явно отличаются от остальных перечисленных! Пункты File и Edit расположены в видимой части главного меню программы, а прочие нет. Пункты в видимой части главного меню называются пунктами верхнего уровня. Выбор пункта File или другого пункта верхнего уровня приводит к появлению прямоугольника, который раньше обычно называли всплывающим или выпадающим меню, но теперь чаще называют подменю или дочерним меню. (Именно так — еще один пример родительских отношений в Windows Forms!) Подменю, вызываемое из пункта File содержит дополнительные пункты Open, Save, Save As и т.д.
С точки зрения программы Windows Forms, пункт меню File содержит массив других пунктов меню, и этот массив включает элементы Open, Save и Save As. Пункт Edit содержит массив пунктов меню, включающий элементы Cut, Copy и Select All.
На самом деле, если подняться на уровень выше, станет ясно, что главное меню само по себе является массивом пунктов меню, включающим элементы File, Edit и все остальные из видимой части главного меню, причем часто последним пунктом является Help (Справка). Каждый пункт в главном меню связан с собственным массивом пунктов меню: и каждый массив является подменю главного меню. Некоторые из пунктов в них также содержат собственные массивы пунктов меню для вызова вложенных подменю. Точно так же контекстные меню являются массивом пунктов меню, каждый из которых может ссылаться на дополнительные массивы пунктов меню.
Классы MainMenu, ContextMenu и MenuItem наследуют абстрактному классу Menu из пространства имен System.Windows.Forms. Далее приведена иерархия классов:
В первую очередь вы должны обратить внимание на то, что Menu не является наследником Control и такие знакомые свойства, как BackColor, ForeColor и Font, недоступны. Только пользователи могут изменять цвет и шрифт меню, но не программы. Если вы хотите выводить меню нестандартным шрифтом и в нестандартном цвете, вам придется задействовать возможность прорисовки владельцем, которую я опишу в конце этой главы.
Я упомянул, что главное меню формы является массивом пунктов меню. Вот два конструктора MainMenu, второй из которых демонстрирует этот факт:
Конструкторы MainMenu
MainMenu() |
MainMenu(MenuItem[] ami) |
Чтобы связать конкретный объект MainMenu с формой, надо присвоить его свойству Menu формы:
Свойства Form (выборочно)
Тип | Свойство | Доступ |
MainMenu | Menu | Чтение/запись |
Точно так же ContextMenu содержит два конструктора, второй из которых демонстрирует то, что контекстное меню является массивом элементов меню:
Конструкторы ContextMenu
ContextMenu() |
ContextMenu(MenuItem[] ami) |
Свойство ContextMenu класса Control позволяет связать конкретный объект ContextMenu с любым элементом управления:
Свойства Control (выборочно)
Тип | Свойство | Доступ |
ContextMenu | ContextMenu | Чтение/запись |
Если на форме несколько элементов управления или если форма разделена на несколько функциональных областей с помощью панелей, каждый элемент может вызывать собственное контекстное меню. Но при этом для реализации контекстных меню не обязательно использовать свойство элемента управления ContextMenu. Вместо этого можно вручную вызывать контекстные меню в методе OnMouseUp в зависимости от текущего местоположения курсора.
Хотя конструкторы MainMenu и ContextMenu указывают на то, что эти объекты связаны с массивами пунктов меню, я еще не ознакомил вас с конструкторами MenuItem. Вот первые пять из шести:
Конструкторы MenuItem (выборочно)
MenuItem() |
MenuItem(string strText) |
MenuItem(string strText, EventHandler ehClick) |
MenuItem(string strText, EventHandler ehClick, Shortcut sc) |
MenuItem(string strText, MenuItem[] ami) |
MenuItem имеет еще один, довольно сложный конструктор, осуществляющий слияние меню.
Мы еще рассмотрим класс MenuItem гораздо подробнее, но будет невредно прямо сейчас привести несколько примеров. Для пункта меню верхнего уровня вроде File может применяться последний конструктор из таблицы:
new MenuItem("&File", amiFile)
Амперсанд перед F в слове «File» указывает на то, что F должна быть подчеркнута и что она будет частью встроенного клавиатурного интерфейса Windows для меню. Когда пользователь нажимает клавишу Alt и затем F, выводится подменю для File. Дня отображения амперсанда в тексте меню, его надо ввести дважды.
Параметром amiFile для только что приведенного конструктора будет массив пунктов меню, содержащий пункты Open, Save, Save As, и т.д. Один из элементов этого массива — пункт меню Open, который мог быть создан конструктором:
new Menultem("&Open...", new EventHandler(MenuFileOpenOnClick), Shortcut.CtrlO)
И опять амперсанд указывает на то, что буква О должна быть подчеркнута. Нажатие Alt, F и затем О вызывает пункт Open. Многоточие указывает на то, что пункт меню вызывает диалоговое окно.
Каждый пункт меню, не вызывающий подменю, обычно связан с обработчиком события Click, которое происходит, когда пользователь щелкает по пункту меню или нажимает соответствующую комбинацию клавиш. Для таких обработчиков событий я буду использовать стандартную схему наименования. В реальных программах метод MenuFileOpenOnClick отвечает за вывод диалогового окна, позволяющего пользователю выбрать открываемый файл. (О диалоговых окнах см. главу 16.)
netlib.narod.ru | < Назад | Оглавление | Далее > |