Pregunta

Estoy intentando arrastrar una forma alrededor de una caja de imágenes en el evento MouseMove, pero estoy luchando por que se mueva sin problemas. El cuadro de imagen tiene una imagen cargada como fondo y me gustaría que el objeto de gráficos arrastre un círculo encima de la imagen cuando el mouse se hace clic y se arrastra.

Lo tengo trabajando creando un clon de la imagen original cada vez que el mouse se mueve y recarga el cuadro de imágenes, pero parece que debe ser una mejor manera de lograr esto.

Sin recargar el mapa de bits original cada vez que se agregan gráficos en la imagen creando un rastro que es más como una aplicación de pintura.

¿Cómo borro los dibujos anteriores sin recargar toda la imagen cada vez? Cualquier ayuda apreciada.

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;
}
¿Fue útil?

Solución

Para resolver el problema de la mejor manera, use Piccanvas.Paint evento. Establezca las posiciones en el evento MouseMove y use esas posiciones para dibujar en el evento de pintura.

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

Debe agregar el evento de pintura al control y establecer la imagen en Formargue o alguna función de inicialización.

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

Otros consejos

Verifique esta muestra, es más simple

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

Usando la respuesta anterior de Honibis, terminé con esto.

Cargar en la imagen e invalidar la imagen para que se actualice

picCanvas.Image = image;
picCanvas.Invalidate()

luego en el evento de pintura

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);
    }
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top