| Китай |
Стандартные меню приложений
Программирование узлов меню верхнего уровня
Команды меню (опции) являются неотъемлемой частью интерфейса пользователя в современных программах. Код обработчиков элементов меню реализует основную функциональность приложения и требует пристального внимания разработчика. Заполним наши обработчики команд нужным кодом. Тщательно разберитесь в нем, поскольку он реализует логику программы и во многом может стать для вас (программистов!!!, но не кочегаров и зольщиков) поучительным.
Ранее мы создали заготовки обработчиков для всех значимых элементов меню. Пришла пора их запрограммировать, тем самым обеспечив функциональность программе. Значимые элементы меню недаром называют командами. Именно через них пользователь, незнакомый с тонкостями программирования, управляет компьютером для выполнения своей работы.
Вначале запрограммируем все обработчики элементов меню верхнего уровня, которые срабатывают при раскрытии главных узлов. Главная задача состоит в том, чтобы сделать высплывающие меню контекстно-зависимыми, например, некоторые команды скрыть или показать недоступными для выбора.
Узел 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
Здесь вызывается статический метод класса системного буфера обмена. Первым параметром метода является ссылка на объект, содержащий копируемые данные. Второй параметр устанавливает, чтобы данные сохранялись в системном буфере даже после закрытия приложения.
