1

我正在尝试转换一些 Delphi 代码,因为我们正在.Net 中重写 Delphi 6.0 (VCL) 应用程序。我不确定也无法弄清楚 2 个 Delphi Tpoints(x,y) 与 C# Point(x,y) 之间的比较。

我试图在 2 点之间画一条线,但由于我不知道 Delphi 是如何绘制它的,所以我无法为其设置 C# 坐标。

Delphi 代码很简单:

Canvas.MoveTo(x, y - 128);    
Canvas.LineTo(x, y);

我知道 C# 坐标虽然大约每英寸 72 点,但需要计算像素密度。但我不确定德尔福 PPI。

任何将不胜感激。谢谢。

编辑:如果有人在我的代码片段中没有TPoint时想知道我在说什么, Canvas.MoveTo 会设置 TPoint 类型的画布的 PenPos属性

4

1 回答 1

4

我不确定这里要问的确切问题是什么。您的代码片段中没有 Delphi TPoint;您只需拥有客户矩形逻辑坐标。

原点位于X = 0, Y = 0客户区的左上角。增加X使位置向右移动,增加Y使位置向下移动。逻辑单位是像素,因此从 的原点开始0, 0,aCanvas.MoveTo(10, 10)会将新的绘图位置设置为从左边缘 10 个像素到顶部 10 个像素,并且Canvas.LineTo(20, 20)从那里开始绘制一条从点 at10, 10到的线20, 20

TCanvas.MoveTo并且TCanvas.LineTo只是底层 Windows GDI 函数MoveToEx(始终带有NULL第三个参数)和LineTo.

就 C# 等价物而言,如果您指的是System.Drawing.Point,则使用的单位完全相同(尽管我不确定默认情况下原点在哪里)。给定 的原点0, 0System.Drawing.Point(10, 10)应该是上述相同的位置 - 距左边缘 10 个像素,距上边缘 10 个像素。

快速检查确认 WinForms 应用程序中的原点实际上是客户区的左上角,使用:

// Delphi code
procedure TForm3.FormPaint(Sender: TObject);
begin
  Canvas.Pen.Color := clRed;
  Canvas.MoveTo(0, 0);
  Canvas.LineTo(100, 100);
end;

// C# code
private void Form1_Paint(object sender, PaintEventArgs e)
{
    Pen newPen = new System.Drawing.Pen(Color.Red);
    e.Graphics.DrawLine(newPen, new Point(0, 0), new Point(100, 100));
}

这会产生以下输出:

并排输出比较

于 2013-06-20T15:54:14.020 回答