Перетаскивание графических объектов поверх растровых изображений - PullRequest
1 голос
/ 02 февраля 2011

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

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

Без перезагрузки исходного растрового изображения каждый раз, когда любая добавленная графика остается на изображении, создавая след, которыйбольше похоже на приложение для рисования.

Как очистить предыдущие рисунки, не перезагружая все изображение каждый раз?Любая помощь приветствуется.

private void picCanvas_MouseMove(object sender, MouseEventArgs e)
{
    if (_drag)
    {
        picCanvas.Image = (Bitmap)_original.Clone();
        Graphics g = Graphics.FromImage((Bitmap)picCanvas.Image);
        g.DrawEllipse(_whitePen, e.X, e.Y, 10, 10);
        picCanvas.Invalidate();
    }
}

private void picCanvas_MouseDown(object sender, MouseEventArgs e)
{
    _drag = true;
}

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

Ответы [ 3 ]

3 голосов
/ 08 октября 2012

проверить этот образец проще

//Load Image
Bitmap TestImage = new Bitmap(FileName);
//Create Graphics Object
Graphics g = Graphics.FromImage(TestImage);                   
g.DrawEllipse(new Pen(Color.Red), i, j,0.5F, 0.5F);
//View Your Results
pictureBox1.Image = TestImage;
0 голосов
/ 02 февраля 2011

Используя приведенный выше ответ Хонибиса, я закончил с этим.

загрузить изображение и сделать изображение недействительным для обновления

picCanvas.Image = image;
picCanvas.Invalidate()

затем в событии рисования

private void picCanvas_Paint(object sender, PaintEventArgs e)
{
  if (_drag)         
  {
    using (Pen pen = new Pen(Color.White, 2))
    {
      e.Graphics.DrawEllipse(pen, pos.X, pos.Y, 10, 10);
    }
  }
}
0 голосов
/ 02 февраля 2011

Чтобы решить проблему наилучшим образом, используйте событие picCanvas.Paint . Установите позиции при событии mousemove и используйте эти позиции для рисования при событии рисования.

    Point pos = Point.Empty;// or your initial position

    private void picCanvas_MouseMove(object sender, MouseEventArgs e)
    {
        if (_drag)
        {
            pos = e.Location;
        }
    }
    private void picCanvas_Paint(object sender, PaintEventArgs e)
    {
        if (_drag)
        {
            Graphics g = e.Graphics;//The event handler sends us the graphics object to use for painting
            g.DrawEllipse(_whitePen, pos.X, pos.Y, 10, 10); 
        }
    }

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

picCanvas.Image = (Bitmap)_original.Clone(); 
...