
- •Ползунки
- •Инвертирование цветов и вывод цветовых констант
- •Отображение оттенков серого цвета
- •Вывод цветовых имен
- •Связывание компонентов с подписями к ним
- •Привязка компонентов
- •2 Работа с графическими файлами, рисование тонким пером
- •Создание, сохранение и загрузка графических файлов
- •Отслеживание текущих координат изображения
- •Рисование пером
- •Очистка изображения
- •Рисование цветным пером
- •Рисование прямых линий
- •Настройка фонового цвета
- •Рисование прямоугольников
- •Рисование эллипсов
- •Рисование прозрачных фигур
- •Рисование квадратов и окружностей
- •Отмена предыдущей операции
- •Задание цветов с помощью пипетки
- •Добавление в рисунок текста
- •Настройка стиля изображения линии
Отмена предыдущей операции
В класс Form1 добавьте новое поле: private Bitmap oldlmage;
В конструктор класса Form1 добавьте оператор:
oldlmage = new Bitmap(pictureBox1.Image);
В класс Form1 добавьте новый метод Updateoidimage (листинг 31). Вставьте вызов добавленного метода в обработчики button1_click, button2_click, button4_Click и pictureBox1_MouseDown (листинг 32).
Установите свойство KeyPreview формы Form1 равным True и определите обработчик события KeyDown для формы Form1 (листинг 33).
Листинг 31. Метод UpdateOldImage формы Form1
private void UpdateOldlmage ()
{oldlmage.Dispose() ;
oldlmage = new Bitmap (pictureBox1. Image) ;}
Листинг 32. Новый вариант методов buttonl_click, button2_click, bu tton4_C1ick и pictureBox1_MouseDown
private void buttonl_Click(object sender, EventArgs e)
{form2.ActiveControl = fоrm2.numericUpDownl;
if (form2.ShowDialog() == DialogResult.OK)
{saveFileDialogl.FileName = "";
Text = "Image Editor";
UpdateOldlmage();}}
private void button2_Click(object sender, EventArgs e)
{startPt = nullPt;
if (openFileDialogl.ShowDialog() == DialogResult.OK)
{string s = openFileDialogl.FileName; try {
Image im = new Bitmap (s);
Graphics g = Graphics.Fromlmage(im); g.Dispose();
if (pictureBox1.Image != null) pictureBox1.Image.Dispose();
pictureBox1.Image = im;
UpdateOldlmage();}
catch
{MessageBox.Show("File " + s + " has a wrong format.","Error"); return;
Text = "Image Editor - " + s;
saveFileDialogl.FileName = Path.ChangeExtension(s, "png");
openFileDialogl.FileName = "";}}
private void button4_Click(object sender, EventArgs e)
{UpdateOldlmage () ;
using (Graphics g = Graphics.Fromlmage(pictureBox1.Image)) g.Clear(brush.Color); pictureBox1.Invalidate();}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{movePt = startPt = e.Location;
UpdateOldlmage () ;}
Листинг 33. Обработчик Form1.KeyDown
private void Forml_KeyDown(object sender, KeyEventArgs e)
{if (e.KeyCode = Keys.Escape)
{pictureBox1.Image.Dispose(); pictureBox1.Image = new Bitmap(oldlmage); }}
Теперь любую графическую операцию (в том числе и закрашивание изображения фоновым цветом, выполняемую по нажатию кнопки Clear) можно отменить сразу после ее выполнения, нажав клавишу <Esc>.
Для возможности отмены последней операции создается вспомогательный объект-изображение oldlmage типа Bitmap. При создании нового или загрузке существующего изображения в объекте oldlmage создается его копия. Перед началом любой операции (в момент нажатия кнопки мыши на компоненте pictureBox1, а также при нажатии кнопки Clear) в объект oldlmage копируется прежний вариант изображения. Если после завершения операции была нажата клавиша <Esc>, то сохраненное в oldlmage изображение копируется в свойство image компонента pictureBox1, отменяя тем самым последнюю операцию.
Для получения копии изображения используется конструктор класса Bitmap с параметром — изображением, которое требуется скопировать. Присваивание без вызова конструктора (например, oldlmage = pictureBox1 . Image) В данном случае использовать нельзя, так как оно не создает копию изображения, а только связывает две объектные переменные с одним и тем же изображением (поскольку в переменных-объектах хранятся лишь ссылки на реальные объекты, размещенные в динамической памяти).
Напомним, что перед присваиванием переменной типа image (в частности, Bitmap) нового значения необходимо вызвать ее метод Dispose для освобождения
ресурсов, связанных с ее прежним изображением. Это действие следует выполнять не только для обычных переменных (как, например, oldlmage), но и для свойства Image компонента PictureBox.