我正在写一个在画布上绘制文本的函数。该功能支持垂直和水平对齐,也支持文本方向。我的问题是,当面向文本时,无法计算正确的对齐方式。这是标头:如何垂直或水平对齐定位文本?
procedure drawText(canvas: TCanvas; pos: TPoint; Text: string;
FontName: TFontName; FontSize: integer; FontColor: TColor; Angle: integer;
Halign: THorizontalAlignement; Valign: TVerticalAlignement);
Halign
可以左,右或中心,Valign
可以是顶部,底部或中心。
一切行之有效的简单的非面向文本用:
h := TextWidth(Text);
case Halign of
haLeft: // do nothing;
;
haRight: x := x - h;
haCenter: x := x - (h div 2);
end;
v := TextHeight(Text);
case Valign of
vaTop: // do nothing;
;
vaBottom: y := y - v;
vaCenter: y := y - (v div 2);
end;
Font.Orientation := Angle;
textOut(x, y, Text);
我已经做了很多的尝试,以确定哪些去的地方,我设法根据其对齐参数垂直文本位置,但水平一个错位。
我知道它与方向,宽度和高度有关,但我无法弄清楚如何处理它。
实例调用程序为horitontal规则时:
drawText(bmp.canvas, point(x, viewOption.padding - DocumentRuleTextMargin),
inttoStr(x), 'arial', 8, clBLack, 0, haCenter, vaBottom);
呼唤垂直规则的程序(一个谁是烦人): 的drawText(bmp.canvas,点(x - CDocumentRuleTextMargin,Y ),inttostr(y),'arial',8,clBlack,900,haCenter,vaBottom);
这里是结果:
我试图通过在程序这样的y位置的计算修正的迹象摆脱这样的:
v := TextHeight(Text);
case Valign of
vaTop: // do nothing;
;
vaBottom: y := y + v;
vaCenter: y := y + (v div 2);
end;
和结果对于垂直规则更好,而对于水平方向则最差:
我希望你先设置角度,然后询问尺寸。 TextExtent为您提供了这些。 –
使用TextRect,先用tfCalcRect。让GDI计算所需的定向宽度和高度。 –
是的。在查询文字大小之前,我曾尝试过很多关注取向的尝试,但它并没有改变所有的位置。 – nico