public class MainWindow: Form {
…
// Указывает отмеченный элемент.
private ToolStripMenuItem currentCheckedItem;
}
Напомним, что размером текста по умолчанию является TextFontSize.FontSizeNormal. С учетом этого начальным отмеченным элементам в ToolStripMenuItem должен быть normalToolStripMenuItem. Измените конструктор формы так, как показано ниже.
public MainWindow() {
// Наследуемый метод для центрирования формы.
CenterToScreen();
InitializeComponent();
// Установка отметки выбора для элемента меню 'Средний'.
currentCheckedItem = normalToolStripMenuItem;
currentCheckedItem.Checked = true;
}
Теперь вы имеете возможность программно идентифицировать отмеченный в настоящий момент элемент, и последним из необходимых шагов будет обновление обработчика события ContextMenuItemSelection_Clicked(). В нем нужно снять отметку выбора с элемента, выбранного ранее, и отметить новый текущий объект ToolStripMenuItem в соответствии с новым выбором пользователя.
private void ContextMenuItemSelection_Clicked(object sender, EventArgs e) {
// Удаление отметки выбора для элемента.
currentCheckedItem.Checked = false;
…
if (miClicked.Name == "hugeToolStripMenuItem") {
currFontSize = TextFontSize.FontSizeHuge;
currentCheckedItem = hugeToolStripMenuItem;
}
if (miClicked.Name = "normalToolStripMenuItem") {
currFontSize = TextFontSize.FontSizeNormal;
currentCheckedItem = normalToolStripMenuItem;
}
if (miClicked.Name == "tinyToolStripMenuItem") {
currFontSize = TextFontSize.FontSizeTiny;
currentCheckedItem = tinyToolStripMenuItem;
}
// Установка отметки выбора для нового элемента.
currentCheckedItem.Checked = true;
…
}
На рис. 19.15 показан законченный проект MenuStripApp в действии.
Исходный код. Проект MenuStripApp размещен в подкаталоге, соответствующем главе 19.
Рис. 19.15. Установка и удаление отметок выбора для элементов ToolStripMenuItem
Работа с StatusStrip
В дополнение к системе меню многие формы предлагают поддержкустроки состояния, которая обычно размещается в нижней части формы. Строка состояния может делиться на любое число "панелей" с текстовой (или графической) информацией, содержащей пояснения для пунктов меню, текущее время или специальные данные приложения.
Хотя поддержка строк состояния (с помощью типа System.Windows.Forms. StatusBar) предлагается с момента появления платформы .NET, в .NET 2.0 вместо простого элемента StatusBar предлагается использовать новый тип StatusStrip. Подобно обычной строке состояния, StatusStrip может состоять из любого числа панелей, содержащих текстовые/графические данные, предоставленные типом ToolStripStatus. Однако StatusStrip может содержать и дополнительные элементы, например, следующего вида.
• ToolStripProgressBar – встроенный индикатор выполнения (хода задания).
• ToolStripDropDownButton – встроенная кнопка, отображающая при щелчке на ней раскрывающийся список вариантов выбора.
• ToolStripSplitButton – подобен ToolStripDropDownButton, но отображает элементы раскрывающегося списка только тогда, когда пользователь щелкает непосредственно в области раскрывающегося списка. ToolStripSplitButton предлагает также поведение, аналогичное обычной кнопке, и поэтому может поддерживать обработку события Click.
Для примера мы построим новый объект MainWindow, в котором поддерживается простое меню (Файл→Выход и Справка→О программе) и StatusStrip. Левая панель строки состояния будет использоваться для отображения строковых данных, соответствующих выбранному в настоящий момент элементу меню (например, при выборе пользователем элемента Выход в строке будет отображаться "Выход из приложения").
Средняя часть строки состояния будет отображать одну из двух динамически создаваемых значений, соответствующих текущему времени и текущей дате. Наконец, правая часть строки состояния будет представлять тип ToolStripDropDownButton, позволяющий пользователю переключиться с отображения даты на отображение времени и наоборот (да еще и с пиктограммой счастливого лица в придачу!). На рис. 19.16 показано окно приложения в своем окончательном варианте.
Рис. 19.16. Приложение StatusStrip
Создание системы меню
Создайте новый проект приложения Windows Forms с именем StatusStripApp. Разместите элемент управления MenuStrip в окне проектирования формы и создайте два пункта меню (Файл→Выход и Справка→О программе). После этого задайте обработку событий Click (щелчок) и MouseHover (задержка указателя мыши) для каждого из дочерних элементов меню (Выход и О программе) с помощью окна свойств.
Реализация обработчика событий Click для элемента Файл→Выход просто завершает работу приложения, а обработчик событий Click для Справка→О программе отображает окно сообщения MessageBox.
private void exitToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); }
private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show("My StatusStripApp!"); }
Обработчики событий MouseHover, отображающие подходящие подсказки в левой панели StatusStrip, мы с вами обновим немного позже. Пока что оставьте их пустыми.
Настройка StatusStrip
Добавьте в окно проектирования формы элемент управления StatusStrip и поменяйте имя этого элемента управления на mainStatusStrip. Следует понимать, что по умолчанию StatusStrip не содержит вообще никаких панелей. Для добавления трех панелей можно использовать разные подходы.
• Создать необходимый программный код вручную, без помощи инструментов проектирования (возможно, с помощью вспомогательного метода CreateStatusStrip(), вызываемого в рамках конструктора формы).
• Добавить нужные элементы в диалоговом окне, появляющемся при выборе ссылки Edit Items (Редактирование элементов) из меню контекстного редактора StatusStrip (см. рис. 19.17).
• Добавить нужные элементы по одному с помощью раскрывающегося меню новых элементов StatusStrip (рис. 19.18).
Мы используем раскрывающееся меню новых элементов. С помощью этого меню добавьте два новых типа ToolStripStatusLabel, назначив им имена toolStripStatusLabelMenuState и toolStripStatusLabelClock, и тип ToolStripDropDownButton с именем toolStripDropDownButtonDateTime. Как и следует ожидать, в результате этого в файл *.Designer.cs будут добавлены новые члены-переменные и соответственно обновлен метод InitializeComponent().
Рис. 19.17. Контекстный редактор StatusStrip
Риc. 19.18. Добавление элементов с помощью раскрывающегося меню новых элементов StatusStrip
Заметьте, что StatusStrip поддерживает внутреннюю коллекцию для представления всех созданных панелей.
partial class MainForm {
private void InitializeComponent() {
…
//
// mainStatusStrip
//
this.mainStatusStrip.Items.AddRange(
new System.Windows.Forms.ToolStripItem[] { this.toolStripStatusLabelMenuState, this.toolStripStatusLabelClock, this.toolStripDropDownButtonDateTime });
…
}
private System.Windows.Forms.StatusStrip mainStatusStrip;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelMenuState;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelClock;
private System.Windows.Forms.ToolStripDropDownButton toolStripDropDownButtonDateTime;
…
}
Теперь в окне проектирования формы выберите ToolStripDropDownButton и добавьте два новых элемента меню День недели и Текущее время, соответственно назначив им имена dayoftheWeekToolStripMenuItem и currentTimeToolStripMenuItem (рис. 19.19).
Рис. 19.19. Добавление пунктов меню для элемента ToolStripDropDownButton
Чтобы настроить панели так, как показано на рис. 19.19, нужно установить подходящие значения для соответствующих свойств в окне свойств Visual Studio 2005. В табл. 19.12 для элементов StatusStrip предлагаются описания свойств, которые нужно установить, и событий, которые нужно обработать (вы, конечно, можете настроить панели так, как сочтете необходимым).
Значение свойства Image члена toolStripDropDownButtonDateTime может указывать на любой файл с изображением, размещенный на вашей машине (при этом, конечно, следует учитывать то, что слишком большие файлы изображений могут порождать проблемы). Для нашего примера вы можете использовать файл happyDude.bmp, предлагаемый вместе с загружаемым исходным кодом для этой книги (посетите раздел загрузки Web-узла Apress, размещенный по адресу http://www.apress.com).
Таблица 19.12. Конфигурация панелей StatusStrip
Член-переменная панели Свойства для установки События для обработки toolStripStatusLabelMenuState Spring=true Text=(пусто) TextAlign=TopLeft Нет toolStripStatusLabelClock BorderSides=All Text=(пусто) Нет toolStripDropDownButtonDateTime Image=(см. ниже) Нет dayoftheWeekToolStripMenuItem Text = "День недели" MouseHover Click currentTimeToolStripMenuItem Text = "Текущее время" MouseHover Click
Итак, проектирование нашего графического интерфейса пользователя завершено. Но, чтобы реализовать оставшиеся обработчики событий, мы с вами должны выяснить роль компонента Timer (таймер).