Лабораторная работа №7

Создание меню

Меню, находящееся между заголовком и клиентской областью окна приложения, называется главным меню. Кроме главного меню существует другой вид меню контекстные меню или их еще называют меню быстрого вызова. Пункты в видимой части главного меню называются пунктами верхнего уровня. Выбор любого пунктаверхнего уровня главного меню приводит к появлению в виде прямоугольника подменю или другими словами дочернего меню. Подменю в свою очередь состоит из нескольких пунктов. В общем случае меню верхнего уровня представляет собой массив пунктов меню, а каждый пункт меню – массив пунктов подменю.

Для создания меню используются классы MainMenu, ContextMenu и MenuItem, порожденные от абстрактного класса Menu. В классе Menu объявлен внутренний класс MenuItemCollection, который наследуется классами MainMenu, ContextMenu и MenuItem.

Для создания главного меню можно использовать один из трех конструкторов класса MainMenu:

 

public MainMenu()

public MainMenu (MenuItem[] menuItems)

public MainMenu (IContainer container)

 

После создания объекта MainMenu, необходимо вызвать свойство формы Menu и передать ему имя объекта MainMenu. Свойство Menu формы доступно как для записи, так и для чтения. Это свойство позволяет заменять в процессе работы приложения, одно меню формы другим.

Для создания контекстного меню можно использовать один из двух


конструкторов класса ContextMenu:

 

public ContextMenu ()

public ContextMenu (MenuItem[] menuItems)

 

Обычно контекстное меню связано с, каким либо, элементом управления, то есть при щелчке правой кнопкой мыши на поверхности элемента управления появляется контекстное меню. Для того чтобы связать объект, являющийся контекстным меню, с элементом управления необходимо использовать свойство ContextMenu элемента, унаследованное им от класса Contol. Свойство ContextMenu доступно как для записи, так и для чтения.

Контекстное меню не обязательно связывать с конкретным контрольным элементом. Его можно вызвать в любом обработчике события, используя метод:

public void Show (Control control, Point pos),

где первый параметр – это ссылка на элемент управления, к которому относится контекстное меню, а второй – координата точки, где будет выведено контекстное меню.

Для создания конечных пунктов меню можно использовать один из конструкторов класса MenuItem:

 

public MenuItem (),

public MenuItem (string text),

public MenuItem (string text, EventHandler onClick),

public MenuItem (string text, MenuItem[] items),

public MenuItem (string text, EventHandler onClick, Shortcut shortcut),

где:

text – название пункта меню,

onClick – объект типа EventHandler, который является делегатом. С помощью

onClick вызывается функция обработчик пункта меню.

shortcut – комбинация клавиш для быстрого вызова пункта меню.

Shortcut - это перечисление допустимых клавиатурный сочетаний для меню. Оно содержит около 150 различных сочетаний. Использовать в качестве комбинации клавиш, не определенных в перечислении не допустимо.

В качестве примера создадим приложение, в котором имеется главное меню из двух пунктов и каждый пункт содержит два подпункта. При выборе любого пункта подменю на экран монитора выводится окно сообщения MessageBox текст, которого соответствует названию пункта. Подменю первого пункта меню верхнего уровня может вызываться с помощью быстрых клавиш ALT+1 и ALT+2.

 

Пример 1:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace Menu1

{

public partial class Form1: Form

{

// Объявление ссылок

MainMenu MnMen1; //Главное меню

//Первый пункт меню верхнего уровня

MenuItem pnkt1;

MenuItem pnkt1_1; //Первый пункт подменю

MenuItem pnkt1_2; //Второй пункт подменю

//Второй пункт меню верхнего уровня

MenuItem pnkt2;

MenuItem pnkt2_1; //Первый пункт подменю

MenuItem pnkt2_2; //Второй пункт подменю

 

public Form1() //Конструктор формы

{

InitializeComponent();

 

this.Text = "МЕНЮ";//Заголовок формы

 

// Создаем первый пункт меню верхнего уровня - массив из подпунктов pnkt1_1 = new MenuItem("Подпункт 1_1", new EventHandler(Msg1_1), Shortcut.Alt1);

pnkt1_2 = new MenuItem("Подпункт 1_2", new EventHandler(Msg1_2), Shortcut.Alt2);

pnkt1 = new MenuItem("Пункт 1", new MenuItem[] { pnkt1_1, pnkt1_2 });

 

// Создаем второй пункт меню верхнего уровня - массив из подпунктов

pnkt2_1 = new MenuItem("Подпункт 2_1", new EventHandler(Msg2_1));

pnkt2_2 = new MenuItem("Подпункт 2_2", new EventHandler(Msg2_2));

pnkt2 = new MenuItem("Пункт 2", new MenuItem[] { pnkt2_1, pnkt2_2 });

 

// Создаем главное меню - массив из пунктов верхнего уровня

MnMen1 = new MainMenu(new MenuItem[] { pnkt1, pnkt2 });

 

this.Menu = MnMen1;//Связываем меню с формой

}

 

 

//Ниже представлены обработчики пунктов меню

 

void Msg1_1(object sr, EventArgs e)

{

MessageBox.Show("Подпункт 1_1");

}

void Msg1_2(object sr, EventArgs e)

{

MessageBox.Show("Подпункт 1_2");

}

void Msg2_1(object sr, EventArgs e)

{

MessageBox.Show("Подпункт 2_1");

}

void Msg2_2(object sr, EventArgs e)

{

MessageBox.Show("Подпункт 2_2");

}

}

}

Скомпилируйте и выполните приложение.

Обратите внимание, что сначала создаются пункты подменю, затем из этих пунктов создается пункт меню верхнего уровня, и в последнюю очередь из пунктов меню верхнего уровня “собирается” главное меню.

Если необходимо в подменю отделить визуально одну группу пунктов от другой горизонтальной линией, то необходимо объявить пункт меню следующим образом:

MenuItem pnkt = new MenuItem(“-“);

Прочерк в качестве имени подменю распознается как разделитель.

Класс MenuItem содержит большое количество свойств. Используя эти свойства можно динамически изменять внешний вид меню, управлять доступом к пунктам меню и т.п.

Некоторые из них:

1. Shortcut - позволяет устанавливать новое сочетание клавиш для быстрого доступа к меню,

2. ShowShortcut - установка значения свойства false запрещает вывод, справа от названия пункта меню, сочетания клавиш быстрого доступа к меню, true - разрешает

3. Text - позволяет изменять название пунктов меню

4. Visible – разрешает (true) - запрещает (false) отбражение пунктов меню.

5. Enabled ­– блокирует пункт меню при установке его в значение false и разблокирует при установке в true. Заблокированный пункт меню становится серым.

6. DefaultItem – установка его в true приводит к тому, что данный пункт меню становится пунктом меню по умолчанию, то есть, при двойном щелчке на пунте меню верхнего уровня, это пункт подменю сразу вызывается. Текст заголовка такого подменю выводится полужирным шрифтом.

7. Checked – установка его в true приводит к тому, что слева от названия пункта подменю выводится галочка.

 

В классе Menu объявлен внутренний класс MenuItemCollection, который наследуется классами MainMenu, ContextMenu и MenuItem. В классе MenuItemCollection реализованы методы, позволяющие добавлять дочерние пункты меню к главному или контекстному меню либо другому пункту.


Некоторые методы:

 

Menultem Add(string caption)

Menultem Add(string caption, EventHandler onClick)

Menultem Add(string caption, MenuItem [] items)

int Add(MenuItem item)

int Add(int index, MenuItem item)

void AddRange(MenuItem[] items)

 

Для определения количества пунктов меню в коллекции можно использовать свойство Count класса MenuItemCollection.

Рассмотрим использование метода Add для создания контекстного меню.

В приведенном примере цвет фона формы меняется в соответствии с выбранным пунктом контекстного меню.

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace CntMn

{

public partial class Form1: Form

{

MenuItem myClr; // пункт меню

ContextMenu ctmn;//Контекстное меню

public Form1()

{

InitializeComponent();

ctmn = new ContextMenu();// создание контекстного меню

//Передаем конструкору делегата функцию обработчик пункта меню

EventHandler ev = new EventHandler(MnClick);

//добавляем в меню пункты

ctmn.MenuItems.Add("Red", ev);

ctmn.MenuItems.Add("Blue", ev);

ctmn.MenuItems.Add("Green", ev);

 

foreach (MenuItem itm in ctmn.MenuItems)

itm.RadioCheck = true;

// Выбираем второй пункт меню

myClr = ctmn.MenuItems[2];

myClr.Checked = true;

//Устанавливаем цвет фона

this.BackColor = Color.FromName(myClr.Text);

//связываем с формой контекстное меню

this.ContextMenu = ctmn;

}

// Это обработчик пункта меню

void MnClick(object sr, EventArgs e)

{

myClr.Checked = false;//снимаем флажок со старого пункта меню

myClr = (MenuItem)sr; //получаем ссылку на текущий пункт меню

myClr.Checked = true;//устанавливаем на нем флажок

this.BackColor = Color.FromName(myClr.Text);

}

}

}

Рассмотрим создание меню с помощью мастеров мастерской разработчика Visual Studio.Net.

Создадим приложение, в котором в меню можно выбрать размер прямоугольника (прямоугольник выводится на экран с запуском приложения) большой или маленький. С помощью контекстного меню можно изменить цвет прямоугольника на красный или синий.

 

1. Для создания меню и контекстного меню необходимо перенести из ToolBox на поверхность формы MainMenu и ContextMenu.

2. Необходимо добавить в пункты «большой» и «маленький». Для этого выделяем mainMenu1 и добавляем данные пункты.

3. В контекстное меню contextMenu1 добавляем пункты «красный» и «синий» аналогичным способом.

4. Теперь создадим переменные, с которыми связаны все изменения прямоугольника:

 

private int width;

private int height;

private Color myColor;

 

5. Инициализируем их в конструкторе Form1():

public Form1()

{

InitializeComponent();

myColor = Color.Red;

width = 10;

height = 10;

}

 

6. В свойствах формы создадим, метод-обработчик события Paint и отредактируем его, чтобы он имел вид:

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

{

Graphics dc = e.Graphics;

Pen myPen = new Pen(myColor);

dc.DrawRectangle(myPen,50,50,width,height);

}

7. Выделим mainMenu1 и двойным щелчком мыши на пункте “Большой” создадим метод-обработчик выбора данного пункта. Отредактируем тело метода, после чего оно должно иметь вид:

 

private void menuItem2_Click(object sender, System.EventArgs e)

{

width = 100;

height = 100;

Invalidate();

}

 

8. Аналогично для пункта “Маленький”:

 

private void menuItem3_Click(object sender, System.EventArgs e)

{

width = 10;

height = 10;

Invalidate();

 

}

 

9. Для пункта contextMenu1 “Красный”:

 

private void menuItem4_Click(object sender, System.EventArgs e)

{

myColor = Color.Red;

Invalidate();

}

 

10. Для contextMenu1 “Синий”:

 

private void menuItem5_Click(object sender, System.EventArgs e)

{

myColor = Color.Blue;

Invalidate();

}

 

11. Для вывода контекстного меню на экран в свойствах формы создаем метод-обработчик события нажатия клавиши мыши, после редактирования метод должен иметь вид:

 

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

Point myPoint = new Point(e.X,e.Y);

if(e.Button.ToString() == "Right")

contextMenu1.Show(this,myPoint);

}

 

12. Компилируем приложение и анализируем полученные результаты.

 

 

Вопросы:

1. Какое меню называется главным меню?

2. Что такое контекстное меню?

3. Какие пункты меню называются пунктами верхнего уровня?

4. Какой класс используется для создания главного меню приложения?

5. Можно ли менять главное меню в процессе работы приложения?

6. Как связать контекстное меню с элементом управления?

7. Как определить в меню клавишу быстрого доступа?

8. Как можно сделать пункт меню недоступным?

9. Как можно пункт меню сделать невидимым?

10. Как задать функцию обработчик пункта меню?

11. Как вывести флажок рядом с названием пункта меню?

 

Задание:

1. Скомпилируйте и выполните приложение по примеру 1. Создайте приложение по примеру 1 с помощью мастеров. Измените, приложение так, чтобы выбранный пункт подменю после срабатывания становился недоступным и вновь становился доступным после срабатывания второго пункта подменю.

2. Скомпилируйте и выполните приложение по примеру 2. Проанализируйте работу приложения. Создайте приложение с помощью мастеров. Добавьте еще несколько пунктов меню для других цветов.

3. Скомпилируйте и выполните приложение по примеру 3. Проанализируйте работу приложения. Определите для пунктов меню клавиши быстрого доступа. Комбинации клавиш быстрого доступа должна отображаться рядом с названием пункта меню.

4. Скомпилируйте и выполните приложение по примеру 3. Проанализируйте работу приложения. Измените, приложение так, чтобы при выборе пункта контекстного меню название цвета (название пункта меню) менялось на некоторый альтернативный. При повторном нажатии название и действие пункта восстанавливалось.

5. Создайте приложение, в котором при нажатии на один пункт меню, слева направо начинал двигаться шар, а при нажатии на другой пункт меню останавливался.

6. Скомпилируйте и выполните приложение по примеру 3. Проанализируйте работу приложения. Изменить приложение так, чтобы в контекстном меню можно было изменить цвет прямоугольника на зеленый, а в главном меню можно было выбрать средний размер.

7. Скомпилируйте и выполните приложение по примеру 3. Изменить приложение так, чтобы контекстное меню появлялось лишь тогда, когда произведен щелчок правой клавишей мыши в области прямоугольника.

8. Создайте приложение, в котором с помощью меню можно задать направление движения шара, который начинает двигаться при щелчке левой кнопки мыши, а останавливается при щелчке на правой кнопке мыши.

9. Создайте приложение, в котором с помощью меню осуществляется выбор фигуры (эллипс, квадрат, треугольник), а с помощью второго пункта меню выбирается цвет для рисования.

10. Создать приложение, в котором при нажатии на кнопку главное меню приложения, с помощью которого можно нарисовать квадрат и прямоугольник, заменялось на другое главное меню, рисующее окружность и эллипс соответственно.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: