2010-12-05 4 views
1

Я должен сделать это: нарисовать стрелку между двумя изображениями из моего холста, поэтому, когда я нажимаю на кнопку со стрелкой на ней, я нажимаю на одно изображение, чтобы вставить стрелку на нее, а затем нарисовать стрелку как как мне нужно, и вставить его во второе изображение.Как нарисовать стрелку между двумя изображениями в WinForms?

+0

Ммм, это не так понятно ... Вы могли бы дать небольшой визуальный пример что вам нужно ? – digEmAll 2010-12-05 21:36:29

+0

Вам нужно больше, чем 2 очка, чтобы нарисовать дугу, как еще вы собираетесь определять размер, начать и угол развертки? – Doggett 2010-12-05 21:52:44

+0

Прошу прощения, я не понимаю, что вы пытаетесь сделать. Можете ли вы четко объяснить: а) то, что у вас есть (хотите) на экране, с точки зрения ящиков, кнопок, дуги и т. Д., И б) что вы хотите делать (пользователь) с точки зрения щелчков мыши и, возможно, click-n- перетаскивания. Благодарю. – ja72 2010-12-05 21:57:22

ответ

1

Чтобы нарисовать дугу с двумя точками, вам понадобится предопределенный угол. Я предполагаю, что вы выяснили эту часть.

Для этого вам нужно нарисовать две дуги, по одному на каждом изображении. Дуга будет больше, чем каждое изображение, но на первом изображении вы можете просто закрепить ее, когда дуга выходит из изображения, идущего ко второй точке.

На втором изображении вам необходимо смещать дугу на расстояние x и y между истоками двух изображений. Затем нарисуйте дугу во втором изображении с первой точки на вторую точку и закрепите ту часть, которая находится за пределами изображения.

Если вам нужна дуга из резинкой, вам придется стирать и перерисовывать ее всякий раз, когда движется мышь. Если вы хотите нарисовать пространство в форме между изображениями, вы можете сделать это, используя правильный сдвиг.

1

У вас есть две точки, поэтому вы можете нарисовать линию. Попробуйте это:

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; } 
} 

и код:

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
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; } 
} 

и код

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))); 

    } 
}