2012-08-05 3 views
0

Je possédais un code de dessin complexe avec GDI + qui dessine quelque chose comme un graphique sur un contrôle utilisateur. Si l'utilisateur clique avec la commande enfoncée, une ligne de marqueur verticale en style tiret doit être affichée.dessiner et supprimer une ligne avec gdi +

Maintenant, je cherche un moyen d'étendre le code de dessin sans toucher au code de dessin complexe.

J'ai créé une classe de marqueur qui se rattache à l'événement mouse-up du contrôle utilisateur. Dans le gestionnaire d'événements, une vérification par rapport à (ModifierKeys == Keys.Control) est effectuée.

Si l'utilisateur détient la touche de contrôle et cliquez avec le bouton gauche de la souris, la méthode de dessin de la classe de marqueur est appelée avec l'objet Graphics comme paramètre du paramètre usercontrol.

Le comportement actuel est que pour chaque clic, une nouvelle ligne est dessinée, mais la ligne doit être supprimée et une nouvelle ligne doit être dessinée.

Comment effacer la ligne tracée? Dois-je redessiner le contenu comlete du contrôle utilisateur?

Répondre

1

La réponse est clairement oui. Avec GDI + vous dessinez directement sur un tampon bitmap, donc si vous souhaitez annuler une opération de dessin précédent, vous pouvez faire une de ces choses (en fonction de la complexité de la question et de la performance):

  • restaurer les octets ont été modifiés sur le tampon bitmap
  • Générez un état antérieur du bitmap de dessin

une solution simple serait d'avoir 2 bitmaps (quelque chose comme ça est généralement appelé double tampon). Celui qui est actuellement affiché (et contient l'état final) et celui qui est utilisé pour l'aperçu seulement. L'aperçu est toujours une copie de la première - juste avec les modifications actuelles.

donc algorithme de base pour cette implémentation simple:

  • départ avec deux bitmaps (dimensions vierges mais identiques) [nom A et B]
  • si l'utilisateur dessine une ligne toujours faire une copie du bitmap a en B et appuyer sur B - montrent B
  • si l'utilisateur se termine la ligne, puis faire une copie de B en a et à nouveau - spectacle B

donc toujours afficher le bitmap de prévisualisation, qui est juste une version modifiée bitmap de l'original.

Voici un exemple de code de programmation en C# (en supposant que tous les événements sont reliés et Bitmap de prévisualisation, B, est la zone d'image elle-même (qui est juste nommé pictureBox1 ici):

Bitmap bmp; 
bool isDrawing; 
Point previous; 

void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    isDrawing = true; 
    previous = e.Location; 
} 

void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
{ 
    isDrawing = false; 
} 

void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (isDrawing) 
    { 
     using (Graphics g = Graphics.FromImage(bmp)) 
     { 
      double wf = (double)bmp.Width/(double)pictureBox1.Width; 
      double hf = (double)bmp.Height/(double)pictureBox1.Height; 
      g.ScaleTransform((float)wf, (float)hf); 
      g.DrawLine(Pens.Black, e.Location, previous); 
     } 

     pictureBox1.Refresh(); 
     previous = e.Location; 
    } 
} 

Ce code fera Il suffit d'appuyer sur le bouton gauche de la souris pour tracer une ligne droite d'un point à un autre

2

Vous ne pouvez pas supprimer une ligne tracée car il n'y a aucun moyen de restaurer les graphiques sous-jacents.

Ce que vous pouvez faire est soit:

  • redessiner le graphique entier (sans la ligne)

ou

  • Stack un second usercontrol transparent sur le dessus et l'utiliser pour afficher la ligne. Enlever et dessiner quand nécessaire.
Questions connexes