Delphi 图形。多边形代码不工作-我缺少什么?

Delphi 图形。多边形代码不工作-我缺少什么?,delphi,graphics,polygon,gdi+,Delphi,Graphics,Polygon,Gdi+,我的小代码创建了具有不同形状的全屏大小的现代艺术画布。 我可以制作椭圆、矩形和直线,但不能制作多边形。有人能帮我吗?(版本:德尔福社区版) 您没有正确传递多边形的点 查看两个重载的DrawPolygon()声明: function TGPGraphics.DrawPolygon(pen: TGPPen; points: PGPPointF; count: Integer): TStatus; function TGPGraphics.DrawPolygon(pen: TGPPen; points

我的小代码创建了具有不同形状的全屏大小的现代艺术画布。 我可以制作椭圆、矩形和直线,但不能制作多边形。有人能帮我吗?(版本:德尔福社区版)


您没有正确传递多边形的点

查看两个重载的
DrawPolygon()
声明:

function TGPGraphics.DrawPolygon(pen: TGPPen; points: PGPPointF; count: Integer): TStatus;
function TGPGraphics.DrawPolygon(pen: TGPPen; points: PGPPoint; count: Integer): TStatus;
您可以看到这些点作为
PGPPoint f
PGPPoint
传递。这些类型的定义可以在
Winapi.GDIPAPI
中找到,在那里我们可以看到坐标是
single
integer

由于您使用的是整数坐标,请查看Winapi.GDIPAPI中
PGPPoint
的定义

type
  PGPPoint = ^TGPPoint;
  TGPPoint = record
    X : Integer;
    Y : Integer;
  end;
  TPointDynArray = array of TGPPoint;

  function MakePoint(X, Y: Integer): TGPPoint; overload;
  {$EXTERNALSYM MakePoint}
所以,声明一个变量

ArrOfPoint: TPointDynArray;
并填写您的积分:

SetLength(ArrOfPoint, 3);
ArrOfPoint[0] := MakePoint(x, y);
ArrOfPoint[1] := MakePoint(x2, y2);
ArrOfPoint[2] := MakePoint(x3, y3);
最后,将对例如
DrawPolygon()
的调用替换为

graphics.DrawPolygon(SolidPen, PGPPoint(@ArrOfPoint[0]), 3);

这意味着您以
PGPPoint
类型传递第一个点的地址。

您没有正确传递多边形的点

查看两个重载的
DrawPolygon()
声明:

function TGPGraphics.DrawPolygon(pen: TGPPen; points: PGPPointF; count: Integer): TStatus;
function TGPGraphics.DrawPolygon(pen: TGPPen; points: PGPPoint; count: Integer): TStatus;
您可以看到这些点作为
PGPPoint f
PGPPoint
传递。这些类型的定义可以在
Winapi.GDIPAPI
中找到,在那里我们可以看到坐标是
single
integer

由于您使用的是整数坐标,请查看Winapi.GDIPAPI中
PGPPoint
的定义

type
  PGPPoint = ^TGPPoint;
  TGPPoint = record
    X : Integer;
    Y : Integer;
  end;
  TPointDynArray = array of TGPPoint;

  function MakePoint(X, Y: Integer): TGPPoint; overload;
  {$EXTERNALSYM MakePoint}
所以,声明一个变量

ArrOfPoint: TPointDynArray;
并填写您的积分:

SetLength(ArrOfPoint, 3);
ArrOfPoint[0] := MakePoint(x, y);
ArrOfPoint[1] := MakePoint(x2, y2);
ArrOfPoint[2] := MakePoint(x3, y3);
最后,将对例如
DrawPolygon()
的调用替换为

graphics.DrawPolygon(SolidPen, PGPPoint(@ArrOfPoint[0]), 3);

这意味着您将第一个点的地址作为
PGPPoint
类型传递。

因此,多边形的更正工作代码如下(目前):


因此,多边形的更正工作代码如下(目前):


你更大的问题是你的画在绘画周期中无法生存。你更大的问题是你的画在绘画周期中无法生存。它可以工作!非常感谢你,汤姆。一开始我很困惑,因为用传统的图形很容易画出多边形。不客气。现在,让它工作,考虑David Heffernan的评论,并将代码移到您的窗体的<代码> OnPaint <代码>事件中,或者将您所要绘制的任何代码移到它。非常感谢你,汤姆。一开始我很困惑,因为用传统的图形很容易画出多边形。不客气。现在,让它工作,考虑David Heffernan的评论,并将代码移到您的窗体的<代码> OnPaint < /C>事件或您想要绘制的任何代码。