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

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

Команда Cut:

  • Найдите обработчик CutOnClick() для команды Cut и заполните его так
private void CutOnClick(object sender, EventArgs e)
        {
            ////////////////////////////////////////////////
            // Используем уже готовые обработчики!!!
            ////////////////////////////////////////////////
            // Копируем в системный буфер обмена
            CopyOnClick(sender, e);
            // Обнуляем контейнер рисунка
            DeleteOnClick(sender, e);
        }
Листинг 28.29. Обработчик команды Cut

Команда Paste:

  • Найдите обработчик PasteOnClick() для команды Paste и заполните его так
private void PasteOnClick(object sender, EventArgs e)
        {
            // Подключаемся к системному буферу обмена 
            IDataObject data = Clipboard.GetDataObject();
    
            // Распознаем тип изображения в буфере обмена и читаем данные
            Type typeMeta = typeof(System.Drawing.Imaging.Metafile);
            if (data.GetDataPresent(typeMeta))
                pictureBox.Image = (Image)data.GetData(typeMeta);
            else
                pictureBox.Image = (Image)data.GetData(typeof(Bitmap));
        }
Листинг 28.30. Обработчик команды Paste

Доступность команды Paste проверяется в узле Edit и зависит от типа ожидаемых данных. Только в случае допустимости типа изображения может сработать обработчик PasteOnClick(), поэтому-то мы и рассматриваем в нем только две альтернативы.

Для команд Open и Save As нам потребуется механизм отображения имени загруженного файла в заголовке окна наряду с самим заголовком. Для этого нужно объявить два поля типа String.

  • Добавьте в начало класса Form3 два поля, связанные с заголовком окна, и инициализируйте одно из них в конструкторе класса
public partial class Form3 : Form
    {
        String originalTitle;   // Поле для хранения чистого заголовка
        String name;            // Поле для хранения имени загруженного рисунка
    
        public Form3()
        {
            InitializeComponent();
    
            LoadImages();// Присоединяем пиктограммы 
    
            CreateView();// Динамически заполняем меню View
    
            originalTitle = this.Text;// Сохраняем чистый заголовок
        }
        ............................................................
    }
Листинг 28.31. Добавление и инициализация полей для хранения заголовка окна

Команда Open:

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

  • Найдите обработчик OpenOnClick() для команды Open и заполните его так
// Обработчик команды Open 
        OpenFileDialog openDialog; // Объявили ссылку на диалог
        bool openFlag = true;// Запускается в первый раз 
        //
        private void OpenOnClick(object sender, EventArgs e)
        {
            if (openFlag)
            {
                openFlag = false;   // Больше не создавать и не настраивать!
                // Создаем и настраиваем диалог
                openDialog = new OpenFileDialog();
                openDialog.Filter = "All allowable Image Files" +                               // 1)Заголовок
                    "|*.bmp;*.ico;*.gif;*.jpeg;*.jpg;*.jfif;*.png;*.tif;*.tiff;*.wmf;*.emf|" +  // 1)|Шаблон|
                    "Windows Bitmap (*.bmp)|*.bmp|" +                               // 2) Заголовок|Шаблон| 
                    "Graphics Interchange Format (*.gif)|*.gif|" +                  // 3) Заголовок|Шаблон|
                    "JPEG File Interchange Format (*.jpg)|*.jpeg;*.jpg;*.jfif|" +   // 4) Заголовок|Шаблон|
                    "Portable Network Graphics (*.png)|*.png|" +                    // 5) Заголовок|Шаблон|
                    "Tagged Image File Format (*.tif)|*.tif;*.tiff|" +              // 6) Заголовок|Шаблон|
                    "Windows Metafile (*.wmf)|*.wmf|" +                             // 7) Заголовок|Шаблон|
                    "Enhanced Metafile (*emf)|*.emf|" +                             // 8) Заголовок|Шаблон|
                    "All Files (*.*)|*.*";                                          // 9) Заголовок|Шаблон
    
                // Устанавливаем последний шаблон активным (по умолчанию 1!)
                String[] str = openDialog.Filter.Split('|');
                openDialog.FilterIndex = str.Length / 2;
            }
    
            // Защищенный код для перехвата системных исключений на 
            // случай попытки загрузки неподдерживаемого формата данных 
            if (openDialog.ShowDialog() == DialogResult.OK)
                try
                {
                    pictureBox.Image = Image.FromFile(openDialog.FileName);
    
                    // Выводим имя рисунка в заголовок окна
                    name = openDialog.FileName;
                    String[] str = name.Split('\\');
                    name = str[str.Length - 1].ToLower();
                    this.Text = "(" + name + ") " + originalTitle;
                }
                catch (Exception ext)
                {
                    MessageBox.Show(ext.Message, this.Text, 
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
        }
Листинг 28.32. Обработчик команды Open

В приведенном коде ссылка на диалог объявлена как поле, чтобы он создавался только один раз и сохранял предыдущие настройки пользователя при повторных обращениях. Фильтр диалога мы тоже настраиваем только раз и для тренировки устанавливаем его на последний шаблон (первый шаблон устанавливается по умолчанию и индекс массива начинается с 1). При формировании фильтра нужно строго следить, чтобы второй член пары "Массив-Шаблон ", т.е. шаблон, не имел пробелов, иначе ошибки не будет, но шаблон не сработает!.

Команда Save As:

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

  • Найдите обработчик SaveAsOnClick() для команды Save As и заполните его так
// Обработчик команды Save As 
        SaveFileDialog saveDialog; // Объявили ссылку на диалог
        System.Drawing.Imaging.ImageFormat[] imageFormat;// Объявили ссылку на массив
        bool saveFlag = true;// Запускается в первый раз 
        //
        private void SaveAsOnClick(object sender, EventArgs e)
        {
            if (saveFlag)
            {
                saveFlag = false;   // Больше не создавать и не настраивать!
                // Создаем диалог
                saveDialog = new SaveFileDialog();
                // Настраиваем фильтр
                saveDialog.Filter = "Windows Bitmap (*.bmp)|*.bmp|" + 
                    "Graphics Interchange Format (*.gif)|*.gif|" + 
                    "JPEG File Interchange Format (*.jpg)|*.jpeg;*.jpg;*.jfif|" + 
                    "Portable Network Graphics (*.png)|*.png|" + 
                    "Tagged Image File Format (*.tif)|*.tif;*.tiff";
    
                // Инициализируем массив допустимыми форматами рисунков
                imageFormat = new System.Drawing.Imaging.ImageFormat[] {
                    System.Drawing.Imaging.ImageFormat.Bmp,
                    System.Drawing.Imaging.ImageFormat.Gif,
                    System.Drawing.Imaging.ImageFormat.Jpeg,
                    System.Drawing.Imaging.ImageFormat.Png,
                    System.Drawing.Imaging.ImageFormat.Tiff
                };
            }
    
            // Заполняем поле именем загруженного рисунка без расширения
            saveDialog.FileName = name.Substring(0, name.LastIndexOf('.'));
    
            // Защищенный код для перехвата системных 
            // исключений на случай сбоя записи
            if (saveDialog.ShowDialog() == DialogResult.OK)
                try
                {
                    // Пытаемся сохранить в формате текущего фильтра
                    pictureBox.Image.Save(saveDialog.FileName,
                        imageFormat[saveDialog.FilterIndex - 1]);
                    // Обновляем контейнер новым форматом - ???????????????
                    //pictureBox.Image = Image.FromFile(saveDialog.FileName);
   
                    // Выводим в заголовок окна имя файла с новым расширением
                    name = saveDialog.FileName;
                    String[] str = name.Split('\\');
                    name = str[str.Length - 1].ToLower();
                    this.Text = "(" + name + ") " + originalTitle;
                }
                catch (Exception ext)
                {
                    MessageBox.Show(ext.Message, this.Text,
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
        }
Листинг 28.33. Обработчик команды Save As

На этом выполнение Упражнения 3 завершено. Испытание можно проводить на рисунках, хранящихся в прилагаемом каталоге Source, или любых других.

  • Запустите приложение и испытайте его работу. Результат должен получиться примерно таким