0

Canvas に右から左への Unicode 文字列を印刷したいと考えています。BidiMode プロパティなどを見つけることができません。

現在、文字列の末尾にある記号は、キャンバスに印刷されるテキストの最初の文字の前に表示されます。

4

2 に答える 2

5

FMX

現時点では、FireMonkey には BiDi 機能はありません。

VCL

このVcl.TControlクラスにはパブリックメソッドDrawTextBiDiModeFlags()とメソッドがあり、Win32 API関数DrawTextBiDiModeFlagsReadingOnly()を呼び出すときに指定する適切な BiDi フラグをコントロールが決定するのに役立ちます。DrawText()

ではVcl.Graphics.TCanvas、そのTextOut()およびTextRect()メソッドは Win32 API 関数を使用せず、代わりにDrawText()Win32 API関数を使用します。プロパティの値は のパラメータに渡されます。このプロパティはプロパティの値にも影響し、内部で図面の X 座標を調整するために使用されます。ExtTextOut()TCanvas.TextFlagsfuOptionsExtTextOut()TextFlagsTCanvas.CanvasOrientationTextOut()TextRect()

で右から左に描画するには、プロパティにフラグをTCanvas含めます。ETO_RTLREADINGTextFlags

于 2015-01-18T00:05:22.460 に答える
0

フォームの双方向モードが「bdLeftToRight」に設定されている場合、RTL テキストを「TextOut」で表示することに成功しなかったため、通常は 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 に答える