使用RightToLeft BidiMode的Delphi Canvas Textout

时间:2015-01-17 18:01:38

标签: delphi canvas bidi

我想在Canvas上打印从右到左的Unicode字符串。我无法找到BidiMode属性或类似的东西来完成它。

目前位于字符串末尾的符号出现在Canvas上打印的文本的第一个字符之前。

2 个答案:

答案 0 :(得分:5)

FMX

FireMonkey目前没有任何BiDi功能。

VCL

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属性的值,TextFlagsTextOut()会在内部使用该属性调整图形的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;