2011-02-02 4 views
1

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

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

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

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

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; 
} 

ответ

0

Чтобы решить эту проблему наилучшим образом использовать 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(); 
+0

Спасибо. Мне нужно было внести небольшие изменения, поскольку событие рисования никогда не получало значения «_drag» true, поэтому никогда не рисовал бы, но вы меня достаточно близко. – fluent

+0

Я забыл добавить строку для графического объекта. См. Отредактированный код. – honibis

+0

Thats еще лучше. большое спасибо. Мне все еще нужно вызвать picCanvas.Invalidate после рисования, или это nevers, похоже, нажимает мой рисунок на экран. – fluent

0

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

нагрузка изображения и аннулирование изображения, чтобы вызвать обновление

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); 
    } 
    } 
} 
3

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

//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; 
Смежные вопросы