2010-08-18 2 views
0

В C# Я использую PictureBox в форме выигрыша.C# Графика, перезаписываемая

Я пытаюсь воссоздать MSPaint, чтобы узнать о графическом объекте. Все работает отлично и денди, за исключением того, что, когда другое окно находится поверх PictureBox или изменяется вся форма, то, что рисуется под другим окном, удаляется.

Ниже приведена сокращенная версия кода, с которым я работаю.

private Graphics _g; 
private bool _bIsMouseDown = false; 

private void picCanvas_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (!_bIsGraphicsSet) _g = picCanvas.CreateGraphics(); 
    _bIsMouseDown = true; 
    DrawRectangle(e); 
} 

private void picCanvas_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (_bIsMouseDown) DrawRectangle(e); 
} 

private void picCanvas_MouseUp(object sender, MouseEventArgs e) 
{ 
    _bIsMouseDown = false; 
} 

private void DrawRectangle(MouseEventArgs e) 
{ 
    System.Drawing.Rectangle r = CreateRectangle(e); 
    Pen pen = ChooseDrawColor(); 
    _g.DrawRectangle(pen, r); 
} 

private Rectangle CreateRectangle(MouseEventArgs e) 
{ 
    int h = 10; 
    int w = 10; 
// there is code in here for multiple sized rectangles, 
//I know the math can be simplified for this example. 
      return new Rectangle(e.X - (w/2), e.Y - (h/2), w, h); 
     } 

Любые мысли были бы очень признательны.

ответ

3

Это потому, что вы не рисуете окно, вы просто рисуете на экране, где находится окно.

Чтобы сделать чертеж, вам необходимо использовать событие Paint. Вам нужно сохранить то, что вы рисуете каким-то образом, либо в виде списка команд, чтобы вы могли их повторять, либо как растровое изображение.

Итак, если вы хотите что-то нарисовать, добавьте его в свой список команд или нарисуйте на растровом изображении, затем вы аннулируете элемент управления так, чтобы вызывается событие Paint. В Paint даже вы добавляете код для фактического рисования, т. Е. Повторяете команды в своем списке или рисуете растровое изображение на элементе управления.

1

Вам необходимо переместить весь код чертежа в обработчик события Paint. В обработчиках событий мыши просто установите некоторые переменные, отражающие новое состояние изображения, и сделайте недействительным окно. Взгляните на этот образец: http://www.codeproject.com/KB/graphics/drawtools.aspx

1

Я думаю, что вы сталкиваетесь с тем, что ваша оспа для фотографии перерисовывается на его событии с краской.

подход я обычно беру для управления заданиями на заказ краски заключается в следующем:

  • магазин некоторое абстрактное представление вашего изображения в качестве члена класса. В вашем случае это может быть коллекция фигур, растровое изображение или так далее.
  • Переопределите метод OnPaint (если расширение элемента управления) или обработчик события Paint и повторите шаги рисования, используя данные, которые вы сохранили выше.
  • В событиях, которые должны вызвать обновление, например picCanvas_MouseDown, вызовите Invalidate() на элемент управления, чтобы заставить его перерисовать.

Поскольку события изменения размера вызывают недействительность, процедура рисования будет вызвана, и изображение останется неизменным.

0

Вы можете создать изображение для хранения чертежа.

private Bitmap _drawBuffer; 

... 

_drawBuffer = new Bitmap(pictureBox.Image); 
_g = Graphics.FromImage(_drawBuffer)); 

... 

private void DrawRectangle(MouseEventArgs e) 
{ 
    System.Drawing.Rectangle r = CreateRectangle(e); 
    Pen pen = ChooseDrawColor(); 
    _g.DrawRectangle(pen, r); 
    pictureBox.Image = _drawBuffer; 
} 

В комплект поставки входит плюс возможность сохранения изображения с помощью функции Image.Save. Вам потребуется изменить размер растрового изображения при изменении размера.

Смежные вопросы