【问题标题】:Delphi TCanvas.TextOut displays mirrored Text in Form with WS_EX_LAYOUTRTLDelphi TCanvas.TextOut 使用 WS_EX_LAYOUTRTL 在表单中显示镜像文本
【发布时间】:2014-07-26 04:11:11
【问题描述】:

我想在希伯来语环境中的 TCanvas 上编写文本。我设置了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 模式。

【问题讨论】:

  • 你能给我们一些屏幕截图吗?您将没有足够的代表将它们添加到 Q 中,但如果您在评论中发布链接,其中一个 mod 可以编辑它们。另外,您为什么使用 CreateParams 而不是内置的 RTL 支持?
  • BiDiMode 属性无法正常工作,无法从右到左显示整个表单。
  • 我想提供帮助,但“无法正常工作”并未传达任何真实信息。请编辑问题以使这部分清晰。我担心您的CreateParams 方法是解决根本问题的错误方法。让我们首先弄清楚根本问题是什么。

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


【解决方案1】:

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

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;

输出符合预期,从右到左。。

我认为没有必要重写 CreateParams。

【讨论】:

  • dropbox.com/s/faw8ingu7nysm8s/OnlyBiDiMode.jpg 如果仅将 BiDiMode 设置为 bdRightToLeft,就会发生这种情况。但我需要像这张图片一样切换整个布局:dropbox.com/s/jnsmlhzqpke93og/Layout.jpg
  • @claaser:我不清楚你想要什么。如果我在上面显示的表单中添加一个单选框,英文文本将正确显示但右对齐(这很容易修复)。
  • 我希望整个对话框都被镜像。如果按钮通常位于右下位置,则它应该镜像在左下位置。 BiDi 模式无法做到这一点。如果我使用提到的 CreateParams 或使用 Windows API 调用 SetProcessDefaultLayout 将布局更改为 RTL,则一切正常除了在画布上编写文本。此文本是镜像编写的,而不是像标签和标题的文本一样简单地对齐镜像。
  • @claaser:您的评论似乎与您在问题中所写的内容截然相反,即您想要镜像文本。
  • 你说得对,我想要镜像文本。这就是我认为我在问题中写的内容。
猜你喜欢
  • 2013-08-31
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 2023-02-07
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多