我想在Canvas上打印从右到左的Unicode字符串。我无法找到BidiMode属性或类似的东西来完成它。
目前位于字符串末尾的符号出现在Canvas上打印的文本的第一个字符之前。
答案 0 :(得分:5)
FireMonkey目前没有任何BiDi功能。
Vcl.TControl
类有公共DrawTextBiDiModeFlags()
和DrawTextBiDiModeFlagsReadingOnly()
方法,可帮助控件决定在调用Win32 API DrawText()
函数时指定的相应BiDi标志。
在Vcl.Graphics.TCanvas
中,其TextOut()
和TextRect()
方法不使用Win32 API DrawText()
函数,而是使用Win32 API ExtTextOut()
函数,其中TCanvas.TextFlags
属性的值将传递给fuOptions
的{{1}}参数。 ExtTextOut()
属性也会影响TCanvas.CanvasOrientation
属性的值,TextFlags
和TextOut()
会在内部使用该属性调整图形的X坐标。
对于使用TextRect()
的从右到左绘图,请在TCanvas
属性中添加ETO_RTLREADING
标记。
答案 1 :(得分:0)
使用" TextOut"显示RTL文本没有成功当表单bidimode设置为" bdLeftToRight"时,我通常使用 XXX.Canvas.TextRect(矩形,文本,[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;