Delphi Firemonkey MeasureText未按预期工作

时间:2017-05-05 16:45:11

标签: delphi firemonkey

我有Delphi 10 Seattle版本23.0.22248.5795。我使用以下代码snipet

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函数时,它不会传回带有显示文本所需的TRectF的ARectF。所以我必须手动设置ARectF才能看到任何东西。请注意,我将其设置为0,0,50,20。我希望能够删除此行,但没有它,屏幕上只显示一个点。

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

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

任何人都可以帮我弄清楚为什么MeasureText没有正确地为我设置ARectF?

1 个答案:

答案 0 :(得分:1)

MeasureText将ArectF参数视为要放置文本的矩形,考虑边界矩形的大小和文本对齐以及其他设置。返回的ARectF := TRectF.Create(0,0,200,100); 包含将在其中呈现文本的实际边界矩形。

例如:

ARectF的输入值

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

你的例子中的其他参数

返回值是(由我舍入)

chmod

由于TTextAlign.Leading而在左侧水平。

由于TTextAlign.Centered

而垂直位于中心

文档有些含糊不清。