C # Графика перезаписывается - PullRequest
0 голосов
/ 18 августа 2010

В c # я использую PictureBox на выигрышной форме.

Я пытаюсь воссоздать 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);
        }

Будем благодарны за любые мысли.

Ответы [ 4 ]

3 голосов
/ 18 августа 2010

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

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

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

1 голос
/ 18 августа 2010

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

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

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

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

1 голос
/ 18 августа 2010

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

0 голосов
/ 18 августа 2010

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

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. Вам нужно будет изменить размер растрового изображения при изменении размера.

...