【问题标题】:Delphi Firemonkey MeasureText not working as expectedDelphi Firemonkey MeasureText 未按预期工作
【发布时间】:2017-05-05 16:45:11
【问题描述】:

我有 Delphi 10 Seattle 版本 23.0.22248.5795。我正在使用以下代码片段

ARectF := TRectF.Create(0,0,0,0);
ABitmap.Canvas.Stroke.Kind := TBrushKind.bkSolid;
ABitmap.Canvas.StrokeThickness := 1;
ABitmap.Canvas.Fill.Color := TAlphaColors.Red;
ABitmap.Canvas.Font.Size := 18;
ABitmap.Canvas.Font.Family:='Arial';
ABitmap.Canvas.Font.Style:=[TFontStyle.fsbold];

ABitmap.Canvas.MeasureText(ARectF, Text, False, [], TTextAlign.Leading);
ARectF := TRectF.Create(0, 0, 50, 20);  //<---- needed to show, but not correct width!
ARectF.TranslateTo(BottomLeftPt); 
if ABitmap.Canvas.BeginScene then try
  DrawFilledRect(ABitmap, ARectF, BackgroundColor, BorderColor, 1, TBrushKind.Solid, 0, 0);
  ARectF.Left := ARectF.Left + 2;
  ABitmap.Canvas.FillText(ARectF, Text, False, 100, [], TTextAlign.Leading);
finally
  ABitmap.Canvas.EndScene;
end;

当我调用 MeasureText 函数时,它没有将 ARectF 与显示文本所需的 TRectF 一起传回。所以我必须手动设置 ARectF 才能看到任何东西。请注意,我将它设置为 0、0、50、20。我希望能够删除这条线,但没有它,屏幕上只会显示一个点。

我尝试跟踪 Delphi 代码,它似乎涉及我没有使用过的布局。我最近才从 VCL 转换为 FMX,并且正在尝试移植代码。我还没有弄清楚布局是如何工作的。坦率地说,我只想在屏幕上绘制文字。

MeasureText() 的文档似乎表明 ARectF 是输出变量。我误解了这个功能的目的吗?如果是这样,我应该如何正确知道文本矩形应该有多宽以处理可变长度的输入?

谁能帮我弄清楚为什么 MeasureText 没有为我正确设置 ARectF?

【问题讨论】:

  • 文档说:“如果 ARect 未初始化,则返回的矩形以 (0,0) 为中心。”你有考虑到这一点吗?我还没有尝试过,但您可能应该使用宽度 0 对其进行初始化,其中将写入文本(并在必要时进行包装)。高度可能会相应调整。
  • @RudyVelthuis 感谢您的回复。我不太明白你在说什么。您说用将要写入文本的宽度对其进行初始化。但我认为这样做的目的是告诉应该是什么宽度。例如,如果我想写“Hello”,那么宽度将与我想写“Hello World”不同。至于以 0,0 为中心的矩形,没关系,我将整个东西翻译到我希望它在屏幕上的位置。我只是想找出文本的宽度。
  • 看来我应该使用 TCanvas.TextWidth(Text);

标签: delphi firemonkey


【解决方案1】:

MeasureText 将ARectF 参数视为要放置文本的矩形,考虑到边界矩形的大小和文本对齐方式以及其他设置。返回的ArectF 包含将呈现文本的实际边界矩形。

例如:

ARectF的输入值

ARectF := TRectF.Create(0,0,200,100);

您的示例中的其他参数

返回值为(我四舍五入)

Left: 0
Top: 39.7
Right: 44.0
Bottom: 60.3

由于 TTextAlign.Leading,水平位于左侧。

因为 TTextAlign.Centered 而垂直居中

文档有些模棱两可。

【讨论】:

  • 你写的东西听起来很真实。我只是希望文档能更有帮助:-)
猜你喜欢
  • 2021-06-04
  • 2022-01-24
  • 2015-05-11
  • 2020-05-15
  • 2014-10-31
  • 2018-02-12
  • 2014-01-20
  • 2015-01-13
  • 2013-08-01
相关资源
最近更新 更多