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