我想在画布上打印从右到左的 Unicode 字符串。我找不到 BidiMode 属性或类似的东西来完成它。
目前,位于字符串末尾的符号出现在打印在画布上的文本的第一个字符之前。
FireMonkey 目前没有任何 BiDi 功能。
该类Vcl.TControl
具有 publicDrawTextBiDiModeFlags()
和方法,可帮助控件在调用 Win32 API函数DrawTextBiDiModeFlagsReadingOnly()
时确定要指定的适当 BiDi 标志。DrawText()
在Vcl.Graphics.TCanvas
中,其TextOut()
和TextRect()
方法不使用 Win32 APIDrawText()
函数,ExtTextOut()
而是使用 Win32 API 函数,其中TCanvas.TextFlags
属性的值传递给 的fuOptions
参数ExtTextOut()
。该TextFlags
属性还影响该属性的值,该值在TCanvas.CanvasOrientation
内部TextOut()
用于TextRect()
调整绘图的 X 坐标。
对于使用 的从右到左绘图,在属性中TCanvas
包含ETO_RTLREADING
标志。TextFlags
当表单双向模式设置为“bdLeftToRight”时,无法成功显示带有“TextOut”的 RTL 文本,所以我通常使用 XXX.Canvas.TextRect(Rect,Text,[tfRtlReading,tfRight]); 对我来说效果很好。我需要检测希伯来语,所以我这样做了:
function CheckHebrew(s: string): boolean;
var
i: Integer;
begin
Result := false;
for i := 1 to Length(s) do
if (ord(s[i])>=1424) and (ord(s[i])<1535) then
begin
Result := true;
exit;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
tf : TTextFormat;
r : TRect;
s : string;
begin
r.Left := 0;
r.Top := 0;
r.Width := Image1.Width;
r.Height := Image1.Height;
s := Edit1.Text;
if CheckHebrew(s) then
tf := [tfRtlReading,tfRight,tfWordBreak]
else
tf := [tfWordBreak];
Image1.Canvas.FillRect(r);
Image1.Canvas.TextRect(r,s,tf)
end;