【发布时间】: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