我正在编写一个在画布上绘制文本的函数。该功能支持垂直和水平对齐,以及文本方向。我的问题是当文本定向时无法计算正确的对齐方式。这是标题:
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 );
我已经做了很多尝试来确定什么去哪里,并且我已经设法根据其对齐参数定位垂直文本,但是水平文本放错了位置。
我知道它与方向、宽度和高度有关,但我无法正确地弄清楚如何处理它。
调用水平规则过程的示例:
drawText( bmp.canvas, point( x, viewOption.padding - DocumentRuleTextMargin),
inttoStr( x ), 'arial', 8, clBLack, 0, haCenter, vaBottom );
调用 Vertical 规则的过程(令人讨厌的那个): drawText( bmp.canvas, Point( 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;
垂直规则的结果更好,而水平规则的结果最差: