Стандартные меню приложений
Программирование узлов меню верхнего уровня
Команды меню (опции) являются неотъемлемой частью интерфейса пользователя в современных программах. Код обработчиков элементов меню реализует основную функциональность приложения и требует пристального внимания разработчика. Заполним наши обработчики команд нужным кодом. Тщательно разберитесь в нем, поскольку он реализует логику программы и во многом может стать для вас (программистов!!!, но не кочегаров и зольщиков) поучительным.
Ранее мы создали заготовки обработчиков для всех значимых элементов меню. Пришла пора их запрограммировать, тем самым обеспечив функциональность программе. Значимые элементы меню недаром называют командами. Именно через них пользователь, незнакомый с тонкостями программирования, управляет компьютером для выполнения своей работы.
Вначале запрограммируем все обработчики элементов меню верхнего уровня, которые срабатывают при раскрытии главных узлов. Главная задача состоит в том, чтобы сделать высплывающие меню контекстно-зависимыми, например, некоторые команды скрыть или показать недоступными для выбора.
Узел File:
- Найдите обработчик FileOnDropDown() события DropDownOpening, которое генерируется при раскрытии элемента File, и запрограммируйте его следующим образом
private void FileOnDropDown(object sender, EventArgs e) { // Сделать недоступным команду SaveAs, если контейнер пустой itemSaveAs.Enabled = pictureBox.Image != null; }Листинг 28.23. Обработчик раскрытия первого узла File
Узел Edit:
- Найдите обработчик EditOnDropDown() события DropDownOpening узла Edit и запрограммируйте его так
private void EditOnDropDown(object sender, EventArgs e) { ///////////////////////////////////////////////// // Регулируем доступность команд Copy, Cut, Delete ///////////////////////////////////////////////// // Нечего редактировать - контейнер пустой itemCopy.Enabled = itemCut.Enabled = itemDelete.Enabled = pictureBox.Image != null; ///////////////////////////////////////////////// // Регулируем доступность команды Paste ///////////////////////////////////////////////// // Ивлекаем адрес системного буфера обмена, // используя интерфейсную ссылку базового типа IDataObject data = Clipboard.GetDataObject(); // Если системный буфер не содержит рисунков // подходящего типа, то вставлять тоже нечего itemPaste.Enabled = data.GetDataPresent(typeof(Bitmap)) || data.GetDataPresent(typeof(System.Drawing.Imaging.Metafile)); }Листинг 28.24. Обработчик раскрытия второго узла Edit
Узел View:
- Найдите обработчик ViewOnDropDown() для узла View и внесите в него следующий код
private void ViewOnDropDown(object sender, EventArgs e) { // При раскрытии узла View перебираем коллекцию // и управляем флажками с помощью состояния pictureBox foreach (ToolStripMenuItem item in itemView.DropDownItems) { item.Checked = (PictureBoxSizeMode)item.Tag == pictureBox.SizeMode; } }Листинг 28.25. Обработчик раскрытия второго узла View
Программирование команд
Приступим к программированию самих команд всплывающих меню.
Команда Exit:
private void ExitOnClick(object sender, EventArgs e) { this.Close(); }Листинг 28.26. Обработчик команды Exit
Команда Delete:
- Найдите обработчик DeleteOnClick() для команды Delete и внесите в него следующий код
private void DeleteOnClick(object sender, EventArgs e) { pictureBox.Image = null; }Листинг 28.27. Обработчик команды Delete
В этом обработчике мы просто обнуляем ссылку на рисунок и изображение исчезает из контейнера pictureBox.
Команда Copy:
- Найдите обработчик CopyOnClick() для команды Copy и заполните его так
private void CopyOnClick(object sender, EventArgs e) { // Заполняем системный буфер обмена рисунком контейнера // Если при раскрытии узла Edit текущий // рисунок есть, то команда Copy доступна Clipboard.SetDataObject(pictureBox.Image, true); }Листинг 28.28. Обработчик команды Copy
Здесь вызывается статический метод класса системного буфера обмена. Первым параметром метода является ссылка на объект, содержащий копируемые данные. Второй параметр устанавливает, чтобы данные сохранялись в системном буфере даже после закрытия приложения.