2010-12-05 114 views
1

我必须这样做:在画布上的两幅图像之间绘制一个箭头,所以当我点击带有箭头的按钮时,点击一个图像将其上的箭头粘贴,然后将箭头绘制为只要我需要并粘贴到第二张图片。如何在WinForms中的两个图像之间绘制箭头?

+0

Mmh的,它不是那么清楚......你可以给一个小例子视觉你需要什么? – digEmAll 2010-12-05 21:36:29

+0

您需要2点以上才能绘制弧线,您还需要确定尺寸,开始和扫掠角度? – Doggett 2010-12-05 21:52:44

+0

我很抱歉,我不明白你在做什么。你能清楚地解释a)屏幕上的东西,包括盒子,按钮,圆弧等等,以及b)你想要做什么(用户)在鼠标点击方面和可能的点击 - 拖动操作。谢谢。 – 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))); 

    } 
} 
相关问题