【问题标题】:Drawing Arrow with sharp end point in C# [duplicate]在C#中绘制带有尖端点的箭头[重复]
【发布时间】:2014-11-20 16:00:54
【问题描述】:

我要在我的winform 中画一些箭头,我已经完成了大部分工作。只有一个问题,我无法区分箭头的终点和起点,它们相互混合,不清楚每个箭头的起点在哪里,终点在哪里,我附上了一张显示我的问题的图片。我想知道如何使它们更清晰或类似(可能是用户友好的)箭头可以很容易地忍受见箭头。 正如您所看到的,因为箭头一个接一个,它们的结束和开始是混合的,我该如何解决这个问题? 谢谢您的帮助 这是我的代码

      using (Pen P = new Pen(Color.LightBlue, 3))
            {

                P.StartCap = LineCap.NoAnchor;
                P.EndCap = LineCap.ArrowAnchor;

                for (int i = 0; i < result.Length; i++)
                {
                    int a = (int)result[i] - 65;
                    int b;
                    try
                    {
                        b = (int)result[i + 1] - 65;
                    }
                    catch (Exception)
                    {

                        b = (int)result[0] - 65;
                    }

                   Point startPoint = new Point(_guiLocations[a].X, _guiLocations[a].Y);
                   Point endPoint = new Point(_guiLocations[b].X, _guiLocations[b].Y);
                   pnlView.CreateGraphics().DrawLine(P, startPoint, endPoint);

                }


            }

【问题讨论】:

  • 代码中的“-65”是什么?
  • @al_amanat 实际上我有两个列表,一个是 char[],另一个是具有 x,y 的点列表,这两个列表通过列表和 char[] 中的位置相互连接列表是从 A 到 Z 的一系列字母,所以如果在列表中找到 char 位置,我必须使用 -65 。所以 A 的位置是 0,B 是 1 ..这些点工作正常,但我看不到箭头的终点因为图纸质量

标签: c# winforms line


【解决方案1】:

我已经稍微修改了您的代码以使其更容易,但我想您可以根据自己的目的对其进行修改:

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        var nodes = new[] { new Node { Code = 'A', Position = new Point(10, 10) }, new Node { Code = 'B', Position = new Point(45, 45) } };

        using (Pen P = new Pen(Color.LightBlue, 3))
        {

            P.StartCap = LineCap.NoAnchor;
            P.CustomEndCap = new AdjustableArrowCap(4, 8, false);

            for (int i = 0; i < nodes.Length; i++)
            {
                var node = nodes[i];
                for (int j = i; j < nodes.Length; j++)
                {
                    var node2 = nodes[j];

                    if (node == node2)
                        continue;

                    Point startPoint = new Point(node.Position.X, node.Position.Y);
                    Point endPoint = new Point(node2.Position.X, node2.Position.Y);
                    pnlView.CreateGraphics().DrawLine(P, startPoint, endPoint);
                }
            }
        }
        pnlView.PerformLayout();
    }

我已经为节点定义了实体类,如下所示:

class Node
{
     public char Code { get; set; }
     public Point Position { get; set; }
}

并定义 CustomEndCap 而不是 EndCap:

P.CustomEndCap = new AdjustableArrowCap(4, 8, false);

【讨论】:

  • 哇..非常感谢。这正是我要找的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
相关资源
最近更新 更多