5

我想绘制一个自定义线帽 - 一个半径为 r 的等边三角形。显然我不能:

  Dim triangleSide As Single = CSng(3 * r / Math.Sqrt(3))
  Dim triangleHeight As Single = CSng(3 * r / 2)
  path = New GraphicsPath()
  Dim points() As PointF = New PointF() { _ 
      New PointF(-triangleSide / 2, 0), _ 
      New PointF(triangleSide / 2, 0), _
      New PointF(0, triangleHeight) }
  path.AddLines(points)

  ' Not Implemented Exception, Was is Das? '
  _HlpCap = New CustomLineCap(path, Nothing) 

我有什么问题还是只是一个框架错误?

编辑:

在 Mark Cidade 评论之后,我尝试使用(Nothing, path)它并且它有所帮助,但我需要填写三角形,而不仅仅是将它划掉......

4

4 回答 4

0

异常来自 GDI+ 库NotImplemented从其GdipCreateCustomLineCap()函数返回状态。尝试传递笔划路径而不是Nothing

  Dim path2 As GraphicsPath = New GraphicsPath()
  path2.AddLines(points);
  _HlpCap = New CustomLineCap(path, path2) 
于 2010-08-03T09:46:59.697 回答
0

显然,路径不能穿过 x 轴。我用这段代码创建了一个箭头帽:

  GraphicsPath capPath = new GraphicsPath();
  float arrowSize = 2.0f;
  capPath.AddLines(new PointF[] {
    new PointF(arrowSize, -(float)Math.Sqrt(3.0) * arrowSize),
    new PointF(0.0f, -0.01f),
    new PointF(-arrowSize, -(float)Math.Sqrt(3.0) * arrowSize)
  });

  CustomLineCap arrowCap = new CustomLineCap(capPath, null, LineCap.NoAnchor, (float)Math.Sqrt(3.0) * arrowSize);
于 2011-12-08T13:15:59.463 回答
0

坏的

这是一个GraphicsPath尝试在行尾之外绘制箭头并导致System.NotImplementedException.

GraphicsPath capPath = new GraphicsPath();
capPath.AddLine(0, 8, -5, 0);
capPath.AddLine(-5, 0, 5, 0);
arrowPen.CustomEndCap = new CustomLineCap(capPath, null); // System.NotImplementedException

这会失败,因为路径必须与负 Y 轴相交。但是上面的路径只通过原点,实际上并没有碰到负 Y 轴。

文档中的注释至关重要:

和参数不能同时使用fillPathstrokePath一个参数必须传递一个空值。如果两个参数都没有传递空值,fillPath将被忽略。如果strokePathnullfillPath则应截取负 y 轴。

这是措辞不佳的情况之一。文档说“应该拦截”,但我认为它“必须拦截”,否则你会得到一个System.NotImplementedException. 此拦截问题仅适用于 a fillPath,而不适用于 a strokePath。(文档也可能使用一些图片。)

好的

GraphicsPath这是一个在行尾绘制箭头并正常工作的示例。无论如何,这可能是大多数人想要画的那种箭头。

在此处输入图像描述

GraphicsPath capPath = new GraphicsPath();
capPath.AddLine(0, 0, -5, -8);
capPath.AddLine(-5, -8, 5, -8);
arrowPen.CustomEndCap = new CustomLineCap(capPath, null); // OK

修正你的例子

解决方法是triangleHeight从 y 中减去。这会将箭头的尖端放置在 0,0(这是线末端的坐标),这很可能是您想要的,并将三角形的底放在-triangleHeight.

float radius = 5.0f;
float triangleSide = 3.0f * radius / (float)Math.Sqrt(3.0f);
float triangleHeight = 3.0f * radius / 2.0f;
GraphicsPath capPath = new GraphicsPath();
capPath.AddLines(new PointF[] {
    new PointF(-triangleSide / 2.0f, -triangleHeight),
    new PointF(triangleSide / 2.0f, -triangleHeight),
    new PointF(0, 0) }
);
arrowPen.CustomEndCap = new CustomLineCap(capPath, null);

为您提供的确切解决方案(在 Visual Basic 中):

  Dim points() As PointF = New PointF() { _ 
      New PointF(-triangleSide / 2, -triangleHeight), _ 
      New PointF(triangleSide / 2, -triangleHeight), _
      New PointF(0, 0) }
  path.AddLines(points)
于 2020-03-02T14:47:40.227 回答
0

在我的情况下,我已经使帽段的长度取决于容器的宽度。每当我将表单缩小到一定限制时,我的程序总是会异常停止。然后我发现当任何段的长度达到 1 时会引发异常。因此,请确保 cap 路径中的所有段的长度都大于 1。

于 2020-12-07T00:54:29.003 回答