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