Page d'acceuil

Informatique > C# > Exemples simples

L'exemple 7 n'offrait pas la persistance du tracé (toute partie de la fenêtre qui était masquée perdait son contenu). L'exemple qui suit montre comment il est possible de rendre le tracé persistant.

L'utilisateur peut choisir la couleur du tracé. Il peut dessiner dans un pictureBox en déplaçant la souris.

Voici le début de la déclaration de la classe Form1. En gras on trouve ce qui a changé par rapport à l'exemple 7:

public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// Variable nécessaire au concepteur.
/// </summary>
private System.ComponentModel.Container components = null;
private System.Windows.Forms.PictureBox picBoard;
private bool bMouseDown = false; // bouton appuyé
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ColorDialog DlgColor;
private System.Windows.Forms.Button btnColor;
private Point OldPos = new Point(-1,-1); // position précédente
private System.Windows.Forms.Panel PnlPenColor;
  private Bitmap bmpInterne = new Bitmap(500,500);   // utilisé pour la persistence du tracé
// Propriété Couleur du stylo private Color fPenColor = Color.Red; // initialisation public Color PenColor { get { return fPenColor; } set { fPenColor = value; PnlPenColor.BackColor = value; } }
....


Voici le code proprement dit permettant de dessiner:

private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
bMouseDown = true;
picBoard.Capture = true; OldPos = new Point(e.X, e.Y); // point de départ du nouveau tracé
}
private void picBoard_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) {
  bMouseDown = false;
  picBoard.Capture = false;
}
private void picBoard_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {
  if (bMouseDown){
    Graphics g = Graphics.FromImage(bmpInterne);
    g.SmoothingMode = SmoothingMode.AntiAlias;                        // mode antialiasing
    Pen pen = new Pen(PenColor,3);                                    // couleur courante, épaisseur 3
    if (OldPos!=new Point(-1,-1))
      g.DrawLine(pen,OldPos,new Point(e.X,e.Y));                      // tracé de la ligne

// Calcul de la zone à redessiner ( recherche du rectangle circonscrit)
int offsetx = Math.Min(e.X,OldPos.X);
int offsety = Math.Min(e.Y,OldPos.Y);
Rectangle rInvalid = new Rectangle(offsetx,offsety, Math.Abs(OldPos.X-e.X),Math.Abs(OldPos.Y-e.Y));
rInvalid.Inflate(3,3); // A cause de l'épaisseur du stylo
picBoard.Invalidate(rInvalid,true);

OldPos = new Point( e.X, e.Y );
}; }
private void button1_Click(object sender, System.EventArgs e) {
  DlgColor.Color = PenColor;
  if (DlgColor.ShowDialog() == DialogResult.OK)
    PenColor = DlgColor.Color;                                       // nouvelle couleur de dessin
}

Et enfin le traitement de l'événement PAINT:

private void picBoard_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawImage (bmpInterne, e.ClipRectangle, e.ClipRectangle, GraphicsUnit.Pixel);
}