2010-11-23 3 views
2

Я хочу, чтобы иметь возможность рисовать прямую стрелку из одного местоположения мыши в другое, как если бы вы делали это в PowerPoint. Он должен быть в состоянии сделать на PictureBox, а также, пожалуйста, помогите,Нарисовать стрелку на Picturebox в C#

Благодарности

ответ

8

Вот некоторые основные код, рисовать линии в PictureBox от мыши вплоть до текущего местоположения.
Вам просто нужно нарисовать еще несколько линий или треугольник для головы стрелки.

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 велика, как всегда – 2010-11-23 12:06:24

+0

Это идеальный вариант, только одна вещь, как мне сделать это так, чтобы стрелка я нарисовали остается там, когда я рисую еще одну стрелу, потому что на данный момент последняя стрелка обращается исчезает, когда я начинаю рисовать новый? Как я могу исправить это, чтобы они остались? Спасибо – 2010-11-23 14:30:46

3

Это легко рисовать стрелки таким же образом, что вы работали, как рисовать линии на PictureBox в a previous question.

Все, что вам нужно сделать, это указать StartCap или EndCap для Pen объекта, который вы уже используете, чтобы рисовать линии. Интуитивно свойство StartCap позволяет указать стиль кепки, который используется в начале любых строк, которые вы рисуете с помощью объекта Pen, а свойство EndCap позволяет указать стиль кепки для конца строк.

Несколько различных LineCap стилей доступны, в том числе:

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. 

Вы, вероятно, найти ArrowAnchor стиль наиболее полезным в этом случае: просто указать ArrowAnchor как LineCap стиль для любого начала или конца строки (в зависимости от направления, в котором вы хотите указать стрелку).

Следующий код будет использовать зеленый, стрелку вправо с толщиной линии 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

со ссылкой на Альбин Sunnanbo ответ, который был большой материал

Если вы хотите чтобы жеребьевке стрелка просто заменить

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(); 
Смежные вопросы