Delphi 如何绘制Unicode文本?

Delphi 如何绘制Unicode文本?,delphi,canvas,delphi-7,Delphi,Canvas,Delphi 7,如何在TCustomControl上绘制Unicode文本?没有画布还有其他选择吗?是的,你说得对。尽管如此,我还是建议您升级到Delphi2009或更高版本,其中VCL具有完全的Unicode支持,并且一切都更加简单 无论如何,你能做到 procedure TMyControl.Paint; var S: WideString; r: TRect; begin inherited; r := ClientRect; S := 'This is the integral si

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

是的,你说得对。尽管如此,我还是建议您升级到Delphi2009或更高版本,其中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中(我想,代码是在我的虚拟Windows95机器中用Delphi7编译的,但我看不到文本。我想这是因为Windows95太旧了。)

更新

如果您想支持非常旧的操作系统,如Windows 95和Windows 98,则需要使用
textowu
而不是
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;

对不起,我的英语,也许DrawTextW会工作?你下载了TNT组件集吗?这比在非unicode delphi版本(2009年之前)中自己做更容易,更容易的是只购买本机使用unicode的delphi XE。这两种方法都有效,谢谢!但unicode特许协议的最佳字体是什么?根据我的经验,最好的字体是Arial unicode。Lucida Sans unicode女士也可以。但当然,你不能指望这些字体被安装在最终用户的计算机上。免费的很好,你可以将它们与你的应用程序一起安装。如何在TCustomControl中居中文本?如何清洁画布?@Robrok:
DrawText
为您做这件事,如果您只指定标志
dtu SINGLELINE
dtu CENTER
(水平居中)和
dtu VCENTER
(垂直居中),并且
r
rect是整个客户端rect(
ClientRect
)。因此,我的第一个代码片段将绘制水平和垂直居中的文本。但是,使用
TextOut
,您需要手动计算文本的左上角。左坐标为
(宽度-文本宽度)div 2
,顶坐标为
(高度-文本高度)div 2
Width
Height
是控件的宽度和高度。您需要以某种方式计算输出字符串的宽度和高度(变量
TextWidth
TextWidth
)。您可以为此使用[
GetTextExtentPoint32W
](
)函数。这很容易。如果您想要代码示例,请发布一个新问题,确切询问如何在Delphi 7中使用
GetTextExtentPoint32W`获得宽字符串的像素宽度和高度,然后再输出。