#c# #image #winforms
#c# #изображение #winforms
Вопрос:
Я пытался реализовать функцию ctrl z в своем приложении mini paint. Проблема в том, что со стороны графического окна это не работает. В начале события наведения курсора мыши перед новым рисунком я сохраняю текущее изображение графического блока в стеке, и когда я нажимаю ctrl z, я извлекаю это изображение и сохраняю его в изображении графического блока. Проблема в том, что он всегда сохраняет новое измененное изображение в стеке, а не предыдущее, даже если я сохранил его технически до новых обновлений (в начале события наведения курсора мыши).
Фрагмент кода
void key(object sender, KeyEventArgs e){
...
else if ( e.Control amp;amp; e.KeyCode == Keys.Z) {
if (save.Count > 0) {
//trying to save the previous image
pictureBox9.Image = save.Peek() as Image;
drawArea = save.Pop() as Bitmap;
pictureBox9.Image = drawArea;
g1 = Graphics.FromImage(drawArea);
// pictureBox9.Refresh();
}
}
}
private void pictureBox9_MouseUp(object sender, MouseEventArgs e){
save.push(pictureBox9.Image);
//save is the stack and that should be the current image
....
}
Комментарии:
1. Кажется, что вы нажимаете на stack и извлекаете из него всегда один и тот же экземпляр image. При нажатии вам нужно сделать копию изображения.
2. Кстати, это обычная ловушка для создания пользовательских чертежей непосредственно в a
PictureBox
. «Обычно PictureBox используется для отображения графики из растрового изображения, метафайла, значка, файла JPEG, GIF или PNG». Вместо этого вы можете рассмотреть возможность создания собственного типа, производного отControl
. Это дает полный контроль над рендерингом и знание того, как он управляется3. Идея копирования, которую я пробовал раньше, и она не сработала. Я скопировал растровое изображение, поместил его в стек, а затем выскочил, но ничего
4. Редактировать, моя проблема была решена путем действительно сохранения клона