Робота з menustrip і contextmenustrip ендрю Троелсен
Робота з MenuStrip і ContextMenuStrip
• ToolStripMenuItem - традиційний пункт меню.
• ToolStripComboBox - вбудований елемент ComboBox (комбіноване вікно).
• ToolStripSeparator - проста лінія, що розділяє вміст.
• ToolStripTextBox - вбудований елемент TextBox (текстове вікно).
З точки зору програміста, елемент управління MenuStrip містить строго типізовану колекцію ToolStripItemCollection. Подібно іншим типам колекції, цей об'єкт підтримує методи Add (), AddRange (), Remove () і властивість Count. Ця колекція зазвичай заповнюється не безпосередньо, а за допомогою різних інструментів режиму проектування, але якщо потрібно, то є можливість обробити її і вручну.
Щоб привести приклад використання елемента управління MenuStrip, створіть новий додаток Windows Forms з ім'ям MenuStripApp. Помістіть елемент управління MenuStrip в форму у вікні проектування, присвоївши йому ім'я mainMenuStrip. В результаті в файл * .Designer.cs додасться нова змінна.
private System.Windows.Forms.MenuStrip mainMenuStrip;
• Вставити "стандартну" систему меню (File, Save, Tools, Help і т.д.), використовуючи посилання Insert Standard Items (Вставити стандартні елементи).
• Змінити стикувальний поведінку MenuStrip.
• Відредагувати будь-який елемент MenuStrip (це просто "швидка альтернатива" щодо можливості вибору відповідного конкретного елемента у вікні властивостей).
Мал. 19.12. Створення системи меню
Зауваження. Ви, напевно, знаєте, що символ амперсанда (), розміщений перед буквою в рядку елемента меню, задає комбінацію клавіш для швидкого виклику даного елемента. У цьому прикладі вказано Файл? Вихід, тому користувач може активізувати меню Вихід, натиснувши спочатку
Кожен елемент меню, введений вами в режимі проектування, є суб'єктом класу ToolStripMenuItem. Відкривши свій файл * .Designer.cs, ви побачите там нові змінні для кожного з введених елементів.
partial class MainWindow
private System.Windows.Forms.MenuStrip mainMenuStrip;
private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
private void InitializeComponent ()
this.menuStrip1.Items.AddRange (new System.Windows.Forms.ToolStripItem []
this.fileToolStripMenuItem.DropDownItems.AddRange (new System.Windows.Forms.ToolStripItem []
Нарешті (що не менш важливо), елемент управління MenuStrip додається в колекцію елементів управління форми. Ця колекції буде розглядатися детально в главі 21, а тут важливо відзначити, чого елемент управління може бути видимим під час виконання тільки в тому випадку, коли цей елемент присутній у зазначеній колекції.
Щоб завершити створення програмного коду нашого прикладу, поверніться в режим проектування і виконайте обробку події Сlick для пункту меню Вихід, використовуючи кнопку подій у вікні властивостей. У створеному обработчике подію, зателефонуйте іншому ApplicationExit.
private void exitToolStripMenuItem_Click (object sender, EventArgs e)
Тепер ви можете скомпілювати і виконати свою програму. Перевірте, що ви можете завершити роботу додатка як за допомогою вибору Файл? Вихід з меню, так і за допомогою натискання <Аlt + ф>, а потім <и> на клавіатурі.
Додавання елемента Textbox в MenuStrip
Давайте створимо новий елемент меню найвищого рівня, присвоївши цьому елементу ім'я Зміна Кольори фону. Підлеглим елементом в цьому меню буде не пункт меню, а елемент ToolStripTextBox (рис. 19.13). Додавши новий елемент управління, змініть його ім'я на toolStripTextBoxColor за допомогою вікна властивостей.
Нашою метою є можливість вибору користувачем кольору (червоний, зелений, рожевий і т.д.). значення якого буде встановлено для властивості BackColor форми. Спочатку обробіть подія LostFocus для нового члена. ToolStripTextBox в рамках конструктора форми (ця подія відбувається тоді, коли TextBox в ToolStrip перестає бути активним елементом інтерфейсу).
toolStripTextBoxColor.LostFocus + = new EventHandler (toolStripTextBoxColor_LostFocus);
Мал. 19.13. Додавання TextBox в MenuStrip
У створеному обробнику події прочитайте строкові дані, введені в ToolStripTextBox (за допомогою властивості Text), і використовуйте метод System. Drawing.Color.FromName (). Цей статичний метод повертає тип Color, відповідний відомому строковому значенням. Щоб врахувати можливість введення користувачем невідомого кольору (або будь-яких інших невідповідних даних), використовується проста логіка try / catch.
void toolStripTextBoxColor_LostFocus (object sender, EventArgs e)
> catch <>// Просто ігнорувати неправильні дані.
Створення контекстних меню
Розглянемо тепер процедуру побудови контекстно-залежних меню (тобто меню, що розкриваються по кліку правої кнопки миші). Класом, використовуваним для побудови контекстних меню в .NET 1.1. був клас ContextMenu, але в .NET 2.0 перевага віддається типу ContextMenuStrip. Подібно типу MenuStrip, тип ContextMenuStrip підтримує ToolStripItemCollection для подання всіх елементів меню (ToolStripMenuItem, ToolStripComboBox, ToolStripSeparator, ToolStripTextBox і т.д.).
Мал. 19.14. створення ContextMenuStrip
Це контекстне меню призначене для того, щоб користувач міг вибрати розмір шрифту для повідомлення, що міститься в області клієнта форми. Щоб спростити собі задачу, створіть тип переліку TextFontSize в рамках простору імен MenuStripApp і оголосіть новий член-змінну цього типу в рамках Form (встановивши для змінної значення TextFontSize.FontSizeNormal).
// Допоміжний перелік для розміру шрифту.
public class MainForm: Form
private TextFontSize currFontSize = TextFontSize.FontSizeNormal;
Наступним кроком є обробка подій Paint форми за допомогою вікна властивостей. Як буде показано в наступному розділі, подія Paint дозволяє відобразити в клієнтської області форми графічні дані (включаючи представлений у відповідному стилі текст). В даному випадку ми повинні відобразити текстове повідомлення, використовуючи зазначений користувачем розмір шрифту. Чи не турбуючись поки що про деталі, змінюйте обробник події Paint так, як пропонується нижче.
private void MainWindow_Paint (object sender, PaintEventArgs e)
Graphics g = e.Graphics;
g.DrawString ( "Клацніть тут правою кнопкою миші ...", new Font ( "Times New Roman", (float) currFontSize), new SolidBrush (Color.Black), 50, 50);
Нарешті, потрібно обробити події Click для кожного з типів ToolStripMenuItem, підтримуваних елементом ContextMenuStrip. При цьому можна, звичайно, мати окремий обробник подій Click для кожного з типів, але ми вкажемо один обробник подій, який буде викликатися при натисканні на будь-якому з трьох елементів ToolStripMenuItem. Використовуючи вікно властивостей, вкажіть для обробника подій Click ім'я ContextMenuItemSelection_Ciicked для всіх трьох типів ToolStripMenuItem і реалізуйте відповідний метод так, як показано нижче.
private void ContextMenuItemSelection_Clicked (object sender, EventArgs e)
// Отримання елемента ToolStripMenuItem,
// на якому виконаний клацання.
ToolStripMenuItem miClicked = (ToolStripMenuItem) sender;
// Пошук елемента, на якій виконаний клацання, за його імені.
if (miClicked.Name == "hugeToolStripMenuItem") currFontSize = TextFontSize.FontSizeHuge;
if (miClicked.Name == "normalToolStripMenuItem") currFontSize = TextFontSize.FontSizeNormal;
if (miClicked.Name == "tinyToolStripMenuItem") currFontSize = TextFontSize.FontSizeTiny;
// Вказівка формі оновити уявлення.
Зверніть увагу на те, що використання аргументу sender дозволяє визначити ім'я члена-змінної ToolStripMenuItem, щоб встановити розмір тексту. Після цього виклик Invalidate () генерує подія Paint, яке викличе ваш обробник події Paint.
Заключним кроком є інформування форми про те, який елемент ContextMenuStrip повинен відображатися при натисканні правої кнопки миші в області клієнта. Для цього за допомогою вікна властивостей встановіть значення властивості ContextMenuStrip рівним імені елемента контекстного меню. Після цього в контексті InitializeComponent () з'явиться наступний рядок.
Якщо виконати додаток тепер, ви зможете змінити розмір відображуваного текстового повідомлення по кліку правої кнопки миші.
Зауваження. За допомогою властивості Context MenuStrip в контекстне меню можна включити будь-який елемент управління. Наприклад, якщо в діалоговому вікні контекстного меню створити об'єкт Button (Кнопка), то відповідний пункт Меню буде відображатися тільки тоді, коли клацання буде виконаний в робочій області кнопки.
Перевірка стану елементів меню
Члени типу ToolStripMenuItem дозволяють перевірити стан елемента меню, зробити його доступним або прихованим. У табл. 19.11 даються опису деяких з найбільш цікавих властивостей цього типу.
Таблиця 19.11. Члени типу ToolStripMenuItem