使用TextOut或DrawTextW写入Canvas时,可以在Delphi PaintBox中使用连字吗?

时间:2016-01-05 04:40:14

标签: delphi canvas unicode fonts

我目前正在尝试在Delphi音乐应用程序中实现http://www.smufl.org/fonts/中的Bravada OTF字体。虽然我可以使用TextOut或DrawTextW轻松地将私有扩展unicode字符渲染到TPaintBox,但是在Delphi中可能无法处理OpenType连字。

具体来说,某些unicode字符用作修饰符......按照Bravada的README:

  

“在Bravura Text中,连字用于调整各个符号的垂直位置。首先,输入与想要更改垂直位置的数量对应的代码点,然后输入代码点。如果你使用的应用程序支持OpenType连字,你应该看到符号出现在所需的垂直位置。“

     

“所以,如果要在G4工作人员位置设置一个黑色的头部,你首先要输入U + EB89(低两个工作人员位置),然后立即进入U + E0A4(黑色头部)。”

我的基本尝试是这样的:

Canvas.TextOut(10,10, #$EB89+#$E0A4);

仅显示两个字符,而不是按所需的垂直偏移移动E084。知道客户有责任理解连字规则并做出相应的响应,Delphi中是否有可用于OTF功能的可行选项?我喜欢画画画布,但即使有更高级的画布VCL在那里......我会接受它。

1 个答案:

答案 0 :(得分:1)

VCL的TCanvas类是微软GDI API的薄包装。 GDI本身并不支持您的要求。但是,您可以使用Microsoft的DirectWrite API(DirectX的一部分),它支持OpenType及其高级功能。

Introducing DirectWrite

  

DirectWrite利用OpenType字体技术的进步,在Windows应用程序中实现高质量的排版...
  ...
  OpenType提供的DirectWrite支持使开发人员能够为其应用程序添加高级排版功能和对国际文本的支持。

可以使用DirectWrite render to a GDI surface。它首先渲染到内存中的位图HDC,然后您可以通过以下方式将其绘制到TPaintBox上:

  1. 将呈现的HDC包装在临时TCanvas对象中,然后使用TPaintBox.CanvasTCanvas.CopyRect()方法将其复制到TCanvas.Draw()。< / p>

  2. 使用GDI的HDCTPaintBox.Canvas.Handle函数将其直接复制到BitBlt()提供的StretchBlt()