Delphi TCanvas.TextOut使用WS_EX_LAYOUTRTL在表单中显示镜像文本

时间:2014-06-05 08:46:03

标签: delphi canvas localization internationalization right-to-left

我想在希伯来语环境中的TCanvas上编写Text。我设置了WS_EX_LAYOUTRTL标志:

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_LAYOUTRTL;
end;

当我在带有TextOut的TCanvas上写文本时,例如 Canvas.TextOut(10,10,'Hello World'); 文本显示右对齐(我想要的)但写入镜像(我不想要的)。

您对如何保留表单的RTL布局并显示未镜像的文本有任何建议吗?希伯来文本也被反映出来,因此不应该是它应该是什么。

我还在顶部的标签上添加了希伯来文“שם”(= name)。写作是正确的。使用TextOut在画布上绘制的相同文本显示镜像的希伯来语,这是错误的。

afik设置WS_EX_LAYOUTRTL标志是说明对话框应该被镜像的正确方法,因为有些Delphi控件没有正确实现BiDi模式。

enter image description here

1 个答案:

答案 0 :(得分:0)

我定义了一个具有以下属性的表单:

object Form1: TForm1
 Left = 192
 Top = 114
 Width = 870
 Height = 640
 BiDiMode = bdRightToLeft
 Caption = 'Form1'
 Color = clBtnFace
 Font.Charset = HEBREW_CHARSET
 Font.Color = clWindowText
 Font.Height = -19
 Font.Name = 'FrankRuehl'
 Font.Style = []
 OldCreateOrder = False
 ParentBiDiMode = False
 OnPaint = FormPaint
 PixelsPerInch = 96
 TextHeight = 18
end

并编写以下代码

procedure TForm1.FormPaint(Sender: TObject);
begin
 canvas.textout (100, 100, 'שלום עולם');
end;

输出符合预期,从右到左。enter image description here

我认为没有必要覆盖CreateParams。