如何绘制 Unicode 文本?

发布于 2024-11-04 09:02:55 字数 49 浏览 0 评论 0原文

如何在TCustomControl上绘制Unicode文本?没有画布还有其他选择吗?

How to draw Unicode text on TCustomControl? Are there other options to make it without the Canvas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

糖粟与秋泊 2024-11-11 09:02:55

是的,你说得对。不过,我还是建议您升级到 Delphi 2009 或更高版本,其中 VCL 具有完整的 Unicode 支持,一切都会变得更加容易。

无论如何,您可以

procedure TMyControl.Paint;
var
  S: WideString;
  r: TRect;
begin
  inherited;
  r := ClientRect;
  S := 'This is the integral sign: '#$222b;
  DrawTextW(Canvas.Handle, PWideChar(S), length(S), r, DT_SINGLELINE or
    DT_CENTER or DT_VCENTER or DT_END_ELLIPSIS);
end;

在旧版本的 Delphi 中执行此操作(我认为。代码在我的虚拟 Windows 95 计算机中的 Delphi 7 中编译,但我看不到任何文本。我认为这是因为 Windows 95 太旧了。)

更新

如果您想支持非常旧的操作系统,例如 Windows 95 和 Windows 98,则需要使用 TextOutW 而不是 DrawTextW,因为后者不是已实施(来源)TextOut 的功能不如 DrawText 强大,因此,例如,如果要将文本置于矩形内的中心,则需要手动计算位置。

procedure TMyControl.Paint;
var
  S: WideString;
begin
  inherited;
  S := 'This is the integral sign: '#$222b;
  TextOutW(Canvas.Handle, 0, 0, PWideChar(S), length(S));
end;

Yes, you are right on spot. Still, I would recommend you to upgrade to Delphi 2009 or later in which the VCL has full Unicode support and everything is much easier.

Anyhow, you can do

procedure TMyControl.Paint;
var
  S: WideString;
  r: TRect;
begin
  inherited;
  r := ClientRect;
  S := 'This is the integral sign: '#$222b;
  DrawTextW(Canvas.Handle, PWideChar(S), length(S), r, DT_SINGLELINE or
    DT_CENTER or DT_VCENTER or DT_END_ELLIPSIS);
end;

in old versions of Delphi (I think. The code compiles in Delphi 7 in my virtual Windows 95 machine, but I see no text. That is because Windows 95 is too old, I think.)

Update

If you want to support very old operating systems, like Windows 95 and Windows 98, you need to use TextOutW instead of DrawTextW, since the latter isn't implemented (source). TextOut is less powerful then DrawText, so you need to compute the position manually if you want to center the text inside a rectangle, for instance.

procedure TMyControl.Paint;
var
  S: WideString;
begin
  inherited;
  S := 'This is the integral sign: '#$222b;
  TextOutW(Canvas.Handle, 0, 0, PWideChar(S), length(S));
end;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文