Arrastrando objetos gráficos en la parte superior de los mapas de bits
-
28-10-2019 - |
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;
}
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);
}
}
}