0

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

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

4

2 回答 2

5

FMX

FireMonkey 目前没有任何 BiDi 功能。

VCL

该类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

于 2015-01-18T00:05:22.460 回答
0

当表单双向模式设置为“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;
于 2016-05-03T07:12:30.863 回答