Delphi TextRect 在画布上居中文本:TTextFormat

gen*_* b. -1 delphi

我试图按照这个示例来了解如何使用TextRect()画布上的居中文本,但它似乎已经过时并且不起作用,因为不再有TTextStyle。相反,TextRect()采用称为TTextFormat.

该线程的原始代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  ts: TTextStyle;
begin
    Canvas.Font.Size:=22;
    Canvas.Font.Color:=clRed;
    ts := Canvas.TextStyle;
    ts.Alignment := taCenter;
    ts.Layout := tlCenter;
    Canvas.TextRect(Rect(100, 100, 300, 300), 0, 0, 'Hello', ts);  // Rect within text is centered, dummy x, dummy y, text, text style
end;
Run Code Online (Sandbox Code Playgroud)

TextRect文档没有提供任何如何使用的示例,TTextFormat包括示例FrameRect

我点击了一些链接TextFlags,但那里没有对齐标志。

我猜现在它是一个带有标志的数组,但是水平和垂直中心对齐的标志是什么?这个例子将如何更新?

And*_*and 5

首先,在 Windows 中,您无法在按钮的单击处理程序中绘制到画布。您只能在窗口的绘画处理程序中绘制画布。

要尝试此操作,请创建一个新的 VCL 应用程序OnPaint并向主窗体添加一个处理程序:

procedure TForm1.FormPaint(Sender: TObject);
begin

  // Fill entire window with white background colour

  Canvas.Brush.Color := clWhite;
  Canvas.FillRect(ClientRect);

  // Draw text in the middle

  Canvas.Font.Color := clBlack;
  Canvas.Font.Size := 32;

  var R := ClientRect;
  var S := 'Hello, World!';

  Canvas.TextRect(R, S, [tfSingleLine, tfVerticalCenter, tfCenter, tfEndEllipsis]);

end;
Run Code Online (Sandbox Code Playgroud)

首先,我们用白色填充整个窗口。这是我们的背景颜色。

然后,我们使用绘制文本

Canvas.TextRect(R, S, [tfSingleLine, tfVerticalCenter, tfCenter, tfEndEllipsis]);
Run Code Online (Sandbox Code Playgroud)

tfCenter标志指示函数将文本水平居中。该tfVerticalCenter标志指示它垂直居中,这只有在我们也指定该tfSingleLine标志时才可能实现。该tfEndEllipsis标志是可选的;如果文本不适合矩形,它将用省略号 (...) 截断文本。

(为了获得奖励积分,请添加一个单行OnResize处理程序,该处理程序会Invalidate在调整窗口大小时调用重绘整个窗口。)

截屏

VCL画布的TextRect功能是使用Win32DrawText函数实现的,该函数有很好的文档记录。