Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 889 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 28:

Стандартные меню приложений

Программирование узлов меню верхнего уровня

Команды меню (опции) являются неотъемлемой частью интерфейса пользователя в современных программах. Код обработчиков элементов меню реализует основную функциональность приложения и требует пристального внимания разработчика. Заполним наши обработчики команд нужным кодом. Тщательно разберитесь в нем, поскольку он реализует логику программы и во многом может стать для вас (программистов!!!, но не кочегаров и зольщиков) поучительным.

Ранее мы создали заготовки обработчиков для всех значимых элементов меню. Пришла пора их запрограммировать, тем самым обеспечив функциональность программе. Значимые элементы меню недаром называют командами. Именно через них пользователь, незнакомый с тонкостями программирования, управляет компьютером для выполнения своей работы.

Вначале запрограммируем все обработчики элементов меню верхнего уровня, которые срабатывают при раскрытии главных узлов. Главная задача состоит в том, чтобы сделать высплывающие меню контекстно-зависимыми, например, некоторые команды скрыть или показать недоступными для выбора.

Узел 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:

  • Найдите обработчик ExitOnClick() для команды 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

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