Delphi Firemonkey MeasureText未按预期工作
我有Delphi10西雅图版本23.0.22248.5795。我正在使用以下代码snipetDelphi Firemonkey MeasureText未按预期工作,delphi,firemonkey,Delphi,Firemonkey,我有Delphi10西雅图版本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; ABi
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;
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)// MeasureText将ARectF
参数视为要将文本放置到其中的矩形,并考虑到边界矩形的大小、文本对齐和其他设置。返回的ArectF
包含文本将呈现到其中的实际边框
例如:
ARectF的输入值
ARectF := TRectF.Create(0,0,200,100);
其他参数如示例中所示
返回值为(由我取整)
由于TTEXTALLIGN.Leading,左侧水平
由于TTEXTALLIGN.Centered,垂直位于中心
文档有点模棱两可。文档中说:“如果未初始化ARect,则返回的矩形以(0,0)为中心。”您考虑过这一点吗?我还没有尝试过,但是您可能应该使用宽度0来初始化它,文本将在其中写入(并且,如果必要,将进行包装)。高度可能会相应调整。@RudyVelthuis谢谢您的回复。我不太明白你在说什么。你说用一个宽度来初始化它,文本将被写入其中。但我认为这样做的目的是告诉我宽度应该是多少。例如,如果我想写“Hello”,那么宽度将不同于我想写“Hello World”。只要矩形的中心为0,0,就可以了,我将整个内容转换到我希望它在屏幕上的位置。我只是想找出文本宽度。看起来我应该使用TCanvas.TextWidth(text);你写的听起来是真的。我只希望文档能更有用:-)
Left: 0
Top: 39.7
Right: 44.0
Bottom: 60.3