Стандартные меню приложений
Команда 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, или любых других.
- Запустите приложение и испытайте его работу. Результат должен получиться примерно таким