Faire glisser des objets graphiques sur le dessus de bitmaps
-
28-10-2019 - |
Question
Je tente de faire glisser une forme autour d'un picturebox sur l'événement mousemove mais je suis mal à l'obtenir pour se déplacer en douceur. La zone d'image a une image chargée en arrière-plan et je voudrais l'objet graphique pour faire glisser un cercle au-dessus de l'image lorsque la souris est cliqué et traîné.
Je l'ai travail en créant un clone de l'image originale à chaque fois que la souris se déplace et rechargeant la zone d'image, mais il semble que leur doit être une meilleure façon d'y parvenir.
sans recharger la bitmap d'origine chaque fois que des graphiques ajoutés restent sur l'image créant une traînée qui ressemble plus à une application de peinture.
Comment effacer les dessins précédents sans recharger l'ensemble de l'image à chaque fois? Toute aide appréciée.
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;
}
La solution
Autres conseils
vérifier cet exemple, il est plus 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;
En utilisant la réponse ci-dessus de Honibis j'ai fini avec cela.
charge à l'image et invalider l'image pour provoquer un rafraîchissement
picCanvas.Image = image;
picCanvas.Invalidate()
puis en cas de peinture
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);
}
}
}