如何绘制Unicode文本?

7

如何在TCustomControl上绘制Unicode文本?是否有其他选项可以在不使用Canvas的情况下实现?


抱歉我的英语不好,也许DrawTextW会起作用? - Little Helper
你下载了TNT组件集吗?在非Unicode的Delphi版本(2009年之前)中,使用它比自己编写更容易,而更容易的方法是购买本地支持Unicode的Delphi XE。 - Warren P
1个回答

11

是的,你说得对。不过,我建议你升级到 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,因为后者没有实现 (来源)TextOutDrawText 功能更弱,所以如果你想在一个矩形中居中文本,你需要手动计算位置。

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;

都可以使用,谢谢!但是什么字体最适合Unicode字符呢? - Little Helper
2
根据我的经验,最好的字体是Arial Unicode MS。Lucida Sans Unicode也可以。但是当然,你不能指望这些字体在最终用户的计算机上已经安装好了。免费的DejaVu字体很不错,你可以将它们与你的应用程序一起安装。 - Andreas Rejbrand
1
@Robrok:如果你只指定标志DT_SINGLELINEDT_CENTER(水平居中)和DT_VCENTER(垂直居中),并且r矩形是整个客户端矩形(ClientRect),那么DrawText会为你完成。因此,我的第一个代码片段将在水平和垂直方向上居中绘制文本。然而,使用TextOut,你需要手动计算文本的左上角。左坐标是(Width-TextWidth) div 2,顶部坐标是(Height-TextHeight) div 2WidthHeight是控件的宽度和高度。你需要想办法弄清楚... - Andreas Rejbrand
当您在Paint过程中时,画布应该被清除。但如果您想手动清除它,请执行Canvas.Brush.Color := clBtnFace; Canvas.Brush.Style := bsSolid; Canvas.FillRect(ClientRect); - Andreas Rejbrand
@Robrok:是的,我知道。这就是为什么我提到了如何找出文本大小的许多细节。(当我写TextOut等时,在这种情况下,我指的是TextOutW等。) - Andreas Rejbrand
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接