Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
П_З.docx
Скачиваний:
3
Добавлен:
24.08.2019
Размер:
179.91 Кб
Скачать

Отмена предыдущей операции

В класс 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.