如何在WinForms中的两个图像之间绘制箭头?

时间:2010-12-05 20:50:45

标签: c# winforms draw geometric-arc

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

3 个答案:

答案 0 :(得分:1)

要绘制带有两个点的圆弧,您需要一个预定义的角度。我猜你已经找到了那个部分。

为此,您需要绘制两个弧,每个图像一个。圆弧将比每个图像都大,但在第一个图像中,您可以将其剪切到弧形退出图像的位置,直到第二个点。

在第二张图像中,您需要将弧线偏移两幅图像原点之间的x和y距离。然后在第二个图像中从第一个点到第二个点绘制圆弧并剪切图像外部的那个部分。

如果你需要一个橡皮筋弧,你必须在鼠标移动时擦除并重绘它。如果要在图像之间的表单上绘制空间,可以使用适当的偏移量来完成。

答案 1 :(得分: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);
    }
}

答案 2 :(得分: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)));

    }
}