Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Троелсен Э. Язык программирования С# 2010 и п...docx
Скачиваний:
113
Добавлен:
21.09.2019
Размер:
6.92 Mб
Скачать

Добавление элемента Textbox в MenuStrip

Давайте создадим новый элемент меню наивысшего уровня, присвоив этому элементу имя Изменение Цвета фона. Подчиненным элементом в этом меню будет не пункт меню, а элемент ToolStripTextBox (рис. 19.13). Добавив новый элемент управления, измените его имя на toolStripTextBoxColor с помощью окна свойств.

Нашей целью является возможность выбора пользователем цвета (красный, зелёный, розовый и т.д.). значение которого будет установлено для свойства BackColor формы. Сначала обработайте событие LostFocus для нового члена. ToolStripTextBox в рамках конструктора формы (это событие происходит тогда, когда TextBox в ToolStrip перестает быть активным элементом интерфейса).

public MainWindow() {

 …

 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) {

 try {

  BackColor = Color.FromName(toolStripTextBoxColor.Text);

 } catch {} // Просто игнорировать неправильные данные.

}

Запустите обновленное приложение снова и попробуйте ввести названия различных цветов. В результате правильного ввода вы должны увидеть изменение цвета фона формы. Чтобы получить информацию о допустимых названиях цветов, изучите информацию о типе System.Drawing.Color в окне обозревателя объектов (Object Browser) Visual Studio 2005 или в документации .NET Framework 2.0 SDK.

Создание контекстных меню

Рассмотрим теперь процедуру построения контекстно-зависимых меню (т.е. меню, раскрывающихся по щелчку правой кнопки мыши). Классом, используемым для построения контекстных меню в .NET 1.1. был класс ContextMenu, но в .NET 2.0 предпочтение отдается типу ContextMenuStrip. Подобно типу MenuStrip, тип ContextMenuStrip поддерживает ToolStripItemCollection для представления всех элементов меню (ToolStripMenuItem, ToolStripComboBox, ToolStripSeparator, ToolStripTextBox и т.д.).

Перетащите новый элемент управления ContextMenuStrip из панели инструментов в окно проектирования формы и измените имя этого элемента управления на fontSizeContextStrip с помощью окна свойств. Обратите внимание на то, что теперь дочерние элементы в ContextMenuStrip можно добавлять графически, почти так же, как при редактировании MenuStrip (очень приятное изменение по сравнению с методом, предлагавшимся в Visual Studio .NET 2003). Для нашего примера добавьте три элемента ToolStripMenuItem с названиями Крупный, Средний и Мелкий (рис. 19.14).

Рис. 19.14. Создание ContextMenuStrip

Это контекстное меню предназначено для того, чтобы пользователь мог выбрать размер шрифта для сообщения, отображаемого в области клиента формы. Чтобы упростить себе задачу, создайте тип перечня TextFontSize в рамках пространства имен MenuStripApp и объявите новый член-переменную этого типа в рамках Form (установив для переменной значение TextFontSize.FontSizeNormal).

namespace MainForm {

 // Вспомогательный перечень для размера шрифта.

 enum TextFontSize {

  FontSizeHuge = 30,

  FontSizeNormal = 20,

  FontSizeTiny = 8

 }

 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;

 // Указание форме обновить представление.

 Invalidate();

}

Обратите внимание на то, что использование аргумента sender позволяет определить имя члена-переменной ToolStripMenuItem, чтобы установить размер текста. После этого вызов Invalidate() генерирует событие Paint, которое вызовет ваш обработчик события Paint.

Заключительным шагом является информирование формы о том, какой элемент ContextMenuStrip должен отображаться при щелчке правой кнопки мыши в области клиента. Для этого с помощью окна свойств установите значение свойства ContextMenuStrip равным имени элемента контекстного меню. После этого в контексте InitializeComponent() появится следующая строка.

this.ContextMenuStrip = this.fontSizeContextStrip;

Если выполнить приложение теперь, вы сможете изменить размер отображаемого текстового сообщения по щелчку правой кнопки мыши.

Замечание. С помощью свойства Context MenuStrip в контекстное меню можно включить любой элемент управления. Например, если в диалоговом окне контекстного меню создать объект Button (Кнопка), то соответствующий пункт Меню будет отображаться только тогда, когда щелчок будет выполнен в рабочей области кнопки.