我正在寫一個在畫布上繪製文本的函數。該功能支持垂直和水平對齊,也支持文本方向。我的問題是,當面向文本時,無法計算正確的對齊方式。這是標頭:如何垂直或水平對齊定位文本?
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