2010-11-23 40 views
2

Je veux être capable de dessiner une flèche droite d'un emplacement de clic de souris à un autre, comme si vous le faisiez dans PowerPoint. Il doit être en mesure de tirer sur un PictureBox aussi bien, s'il vous plaît aider,Dessiner une flèche sur une PictureBox en C#

Merci

Répondre

8

Voici un code de base pour tracer des lignes dans un picturebox de la souris à l'emplacement actuel.
Vous avez juste besoin de dessiner plus de lignes ou un triangle pour la tête de la flèche.

public partial class Form1 : Form 
{ 
    private bool isMoving = false; 
    private Point mouseDownPosition = Point.Empty; 
    private Point mouseMovePosition = Point.Empty; 
    private List<Tuple<Point, Point>> lines = new List<Tuple<Point, Point>>(); 
    public Form1() 
    { 
     InitializeComponent(); 

     // 
     // pictureBox1 
     // 
     this.pictureBox1.Location = new System.Drawing.Point(0, 0); 
     this.pictureBox1.Name = "pictureBox1"; 
     this.pictureBox1.Size = new System.Drawing.Size(231, 235); 
     this.pictureBox1.TabIndex = 0; 
     this.pictureBox1.TabStop = false; 
     this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint); 
     this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown); 
     this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove); 
     this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp); 
     this.Controls.Add(this.pictureBox1); 
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     var g = e.Graphics; 
     if (isMoving) 
     { 
      g.Clear(pictureBox1.BackColor); 
      g.DrawLine(Pens.Black, mouseDownPosition, mouseMovePosition); 
      foreach (var line in lines) 
      { 
       g.DrawLine(Pens.Black, line.Item1, line.Item2); 
      } 
     } 
    } 

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     isMoving = true; 
     mouseDownPosition = e.Location; 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (isMoving) 
     { 
      mouseMovePosition = e.Location; 
      pictureBox1.Invalidate(); 
     } 
    } 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (isMoving) 
     { 
      lines.Add(Tuple.Create(mouseDownPosition, mouseMovePosition)); 
     } 
     isMoving = false; 
    } 
} 
+0

+1 grande, comme toujours –

+0

C'est parfait, juste une chose est de savoir comment puis-je faire de sorte que la flèche que je tire des séjours là quand je dessine une autre flèche, car au moment de la dernière flèche tirée disparaît quand je commence à en dessiner un nouveau? Comment puis-je le réparer pour qu'ils restent? Merci –

+0

@Chris Bacon, Vous les stockez dans une liste: 'Liste > points = nouvelle Liste >();', ajoutez-les à la liste dans MouseUp: 'points .Add (Tuple.Create (mouseDownPosition, mouseMovePosition)) 'et les dessine dans une boucle foreach dans pictureBox1_Paint. –

3

Il est facile de dessiner des flèches de la même façon que vous avez travaillé comment dessiner des lignes sur un PictureBox dans a previous question.

Tout ce que vous devez faire est de spécifier un ou StartCapEndCap pour l'objet Pen vous utilisez déjà pour tracer des lignes. Intuitivement, la propriété StartCap vous permet de spécifier un style de majuscule utilisé au début des lignes que vous dessinez avec l'objet Pen, tandis que la propriété EndCap vous permet de spécifier un style de majuscule pour la fin des lignes.

Plusieurs styles différents LineCap sont disponibles, y compris:

Flat   Specifies a flat line cap. 
Square  Specifies a square line cap. 
Round   Specifies a round line cap. 
Triangle  Specifies a triangular line cap. 
NoAnchor  Specifies no anchor. 
SquareAnchor Specifies a square anchor line cap. 
RoundAnchor Specifies a round anchor cap. 
DiamondAnchor Specifies a diamond anchor cap. 
ArrowAnchor Specifies an arrow-shaped anchor cap. 
Custom  Specifies a custom line cap. 
AnchorMask Specifies a mask used to check whether a line cap is an anchor cap. 

Vous trouverez sans doute le style ArrowAnchor plus utile dans ce cas: Il suffit de spécifier un ArrowAnchor que le style LineCap soit pour le début ou la fin de la ligne (en fonction de la direction dans laquelle vous voulez que la flèche pointe).

Le code suivant dessinera un vert, face à flèche droite avec une épaisseur de ligne de 4:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
//Create a new pen to draw the arrow with 
using (Pen p = new Pen(Brushes.Green, 4f)) 
{ 
    //Specify the EndCap, because we're drawing a right-facing arrow 
    p.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor; 

    //Draw the arrow 
    e.Graphics.DrawLine(p, 0, 0, 30, 45); 
} 
} 
1

en référence à Albin Sunnanbo réponse qui était grande substance

Si vous voulez à tirage flèche vient remplacer

g.DrawLine(Pens.Black, mouseDownPosition, mouseMovePosition); 

à

Pen p = new Pen(Color.Black,3); 
p.StartCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor; 
g.DrawLine(p, mouseDownPosition, mouseMovePosition); 
p.Dispose(); 
+1

Sauf que vous créez maintenant un nouvel objet 'Pen', dont vous ne disposez pas lorsque vous avez terminé avec elle. –