2010-12-05 7 views
1

Ich muss dies tun: um einen Pfeil zwischen zwei Bildern aus meiner Leinwand zu zeichnen, also wenn ich auf die Schaltfläche mit dem Pfeil drauf klicke und ich klicke auf ein Bild, um den Pfeil einzufügen und dann den Pfeil als zu zeichnen so lange ich brauche und es in das zweite Bild einfügen.Wie zeichne ich einen Pfeil zwischen zwei Bildern in WinForms?

+0

Mmh, dann ist es nicht so klar ... könnten Sie geben ein kleines visuelles Beispiel was du brauchst ? – digEmAll

+0

Sie benötigen mehr als 2 Punkte, um einen Bogen zu zeichnen, wie sonst werden Sie Größe, Anfang und Winkel bestimmen? – Doggett

+0

Es tut mir leid, ich verstehe nicht, was Sie versuchen zu tun. Können Sie deutlich erklären, a) was Sie haben (wollen) auf dem Bildschirm, in Bezug auf Boxen, Tasten, Bogen, etc, und b) was Sie (der Benutzer) in Bezug auf Mausklicks und vielleicht klicken-n- tun wollen Ziehen Sie Operationen. Vielen Dank. – ja72

Antwort

1

Um einen Bogen mit zwei Punkten zu zeichnen, benötigen Sie einen vordefinierten Winkel. Ich nehme an, Sie haben diesen Teil herausgefunden.

Um dies zu tun, müssen Sie zwei Bögen zeichnen, einen in jedem Bild. Der Bogen wird größer sein als jedes Bild, aber im ersten Bild können Sie ihn einfach dort abschneiden, wo der Bogen aus dem Bild zum zweiten Punkt hinausgeht.

Im zweiten Bild müssen Sie den Bogen um den x- und y-Abstand zwischen den Ursprüngen der beiden Bilder versetzen. Zeichnen Sie dann den Bogen im zweiten Bild vom ersten Punkt zum zweiten Punkt und schneiden Sie den Teil außerhalb des Bildes ab.

Wenn Sie einen Gummibandbogen benötigen, müssen Sie ihn löschen und neu zeichnen, wenn sich die Maus bewegt. Wenn Sie den Abstand zwischen den Bildern auf dem Formular anzeigen möchten, können Sie dies mit dem richtigen Offset tun.

1

Sie haben zwei Punkte, so dass Sie eine Linie zeichnen können. Versuchen Sie folgendes:

public class Shape 
{ 
    public float X { get; set; } 
    public float Y { get; set; } 
    public Image Image { get; set; } 
} 

public class Line 
{ 
    public Shape A { get; set; } 
    public Shape B { get; set; } 
} 

und den Code:

private string _currentTool; 
private readonly List<Shape> _shapes; 
private readonly List<Line> _lines; 
private Line _currentLine; 

private void Button1Click(object sender, EventArgs e) 
{ 
    _currentTool = "img"; 
} 

private void Button2Click(object sender, EventArgs e) 
{ 
    _currentTool = "line"; 
} 

private void PictureBox1MouseDown(object sender, MouseEventArgs e) 
{ 
    switch (_currentTool) 
    { 
     case "img": 
      _shapes.Add(new Shape { Image = button1.Image, X = e.X, Y = e.Y }); 
      pictureBox1.Invalidate(); 
      break; 
     case "line": 
       var selectedShapes = _shapes.Where(shape => (shape.X - 10 < e.X) && (e.X < shape.X + 10) && 
                  (shape.Y - 10 < e.Y) && (e.Y < shape.Y + 10)); 
       if (selectedShapes.Count() > 0) 
       { 
        var selectedShape = selectedShapes.First(); 
        _currentLine = new Line {A = selectedShape}; 
        pictureBox1.Invalidate(); 
       } 
      break; 
    } 
} 

private void PictureBox1MouseUp(object sender, MouseEventArgs e) 
{ 
    switch (_currentTool) 
    { 
     case "line": 
       var selectedShapes = _shapes.Where(shape => (shape.X - 10 < e.X) && (e.X < shape.X + 10) && 
                  (shape.Y - 10 < e.Y) && (e.Y < shape.Y + 10)); 
       if (selectedShapes.Count() > 0) 
       { 
        var selectedShape = selectedShapes.First(); 
        _currentLine.B = selectedShape; 
        _lines.Add(_currentTool); 
        pictureBox1.Invalidate(); 
       } 
      break; 
    } 
} 

private void PictureBox1Paint(object sender, PaintEventArgs e) 
{ 
    foreach (var shape in _shapes) 
    { 
     e.Graphics.DrawImage(shape.Image, shape.X, shape.Y); 
    } 
    foreach (var line in _lines) 
    { 
     e.Graphics.DrawLine(new Pen(Color.Black), line.A.X, line.A.Y, line.B.X, line.B.Y); 
    } 
} 
+0

Ich habe diesen Code versucht, aber es zeichnet nichts :(. Vielleicht habe ich etwas falsch gemacht – Lidia

+0

@Lidia: 10 erhöhen und erneut testen, das funktioniert! –

0
public class Shape 
{ 
public float X { get; set; } 
public float Y { get; set; } 
public Image Image { get; set; } 

public bool Test_int(int x, int y) 
    { 
     if (((x <= this.x + (float)image.Width) && (x >= this.x)) && ((y <= this.y + (float)image.Height) && (y >= this.y))) 
      return true; 
     else 
      return false; 
    } 
} 



public class Line 
{ 
    public Shape A { get; set; } 
    public Shape B { get; set; } 
} 

und den Code

private string currentTool; 
private readonly List<Shape> shapes; 
private readonly List<Line> lines; 
private Line currentLine; 

private void Button1Click(object sender, EventArgs e) 
{ 
    currentTool = "img"; 
} 

private void Button2Click(object sender, EventArgs e) 
{ 
    currentTool = "line"; 
} 


private void PictureBox1MouseDown(object sender, MouseEventArgs e) 
{ 

    switch (currentTool) 
    { 
     case "img": 
      shapes.Add(new Shape { Image = button1.Image, X = e.X, Y = e.Y }); 
      pictureBox1.Invalidate(); 
      break; 
     case "line": 
      foreach (Shape shape1 in shapes) 
       { 

        if (shape1.Test_int(e.X, e.Y)) 
        { 

         currentLine = new Line { A = shape1 }; 

        } 

       } 
       drawArea1.Invalidate(); 
     break; 
    } 
} 

private void PictureBox1MouseUp(object sender, MouseEventArgs e) 
{ 

    switch (currentTool) 
    { 
     case "line": 
      foreach (Shape shape1 in shapes) 
      { 

       if (shape1.Test_int(e.X, e.Y)) 
       { 


        currentLine.B = shape1; 

        } 

       } 
       lines.Add(currentLine); 
       drawArea1.Invalidate(); 

      break; 
    } 
} 

private void PictureBox1Paint(object sender, PaintEventArgs e) 
{ 

    foreach (var shape in shapes) 
    { 
     e.Graphics.DrawImage(shape.Image, shape.X, shape.Y); 
    } 
    foreach (var line in lines) 
    { 
     Pen p = new Pen(Color.Gray, 1); 
     Pen p2 = new Pen(Color.Black, 5); 

     e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 

     p2.StartCap = System.Drawing.Drawing2D.LineCap.Round; 
     p2.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor; 

     float x1 = line.A.X+line.A.Image.Width ; 
     float y1 = line.A.Y+line.A.Image.Height/2; 
     float x2 = line.B.X; 
     float y2 = line.B.Y+line.B.Image.Height/2; 
     double angle = Math.Atan2(y2 - y1, x2 - x1); 

     e.Graphics.DrawLine(p, x1, y1, x2, y2); 
     e.Graphics.DrawLine(p2, x2, y2, x2 + (float)(Math.Cos(angle)), y2 + (float)(Math.Sin(angle))); 

    } 
} 
+0

Das funktioniert und ich zeichne den Pfeil ein bisschen Besonderes, ich meine, ich wollte die endCap mit dem ArrowArc ist größer als C# Zeichnet sie – Lidia

+0

Probieren Sie 'e.Graphics.ScaleTransform (2, 2);' vor dem Zeichnen. –