Робота з 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;

Робота з menustrip і contextmenustrip ендрю Троелсен

• Вставити "стандартну" систему меню (File, Save, Tools, Help і т.д.), використовуючи посилання Insert Standard Items (Вставити стандартні елементи).

• Змінити стикувальний поведінку MenuStrip.

• Відредагувати будь-який елемент MenuStrip (це просто "швидка альтернатива" щодо можливості вибору відповідного конкретного елемента у вікні властивостей).

Робота з menustrip і contextmenustrip ендрю Троелсен

Мал. 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);

Робота з menustrip і contextmenustrip ендрю Троелсен

Мал. 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 і т.д.).

Робота з menustrip і contextmenustrip ендрю Троелсен

Мал. 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