DirectWrite GDI 互操作:使用"IDWriteFontFace"绘制文本的简单方法
DirectWrite GDI interop: Simple way to draw text using an `IDWriteFontFace`
我有一个设备上下文,其中选择了某种字体,我想在ID2D1RenderTarget
上DrawText
。
目前,我走以下路线来实现这一点:
- 通过
CreateFontFaceFromHdc
获取IDWriteFontFace
。 - 通过默认系统字体集合从
IDWriteFontFace
获取IDWriteFont
(我通过GetSystemFontCollection
获得 - 请参阅下一步)。 - 通过
CreateTextFormat
获取IDWriteTextFormat
,提供IDWriteFont
中指定的参数并将nullptr
指定为fontCollection
,表明我想使用默认的系统字体集合。 - 将
IDWriteTextFormat
传递给DrawText
。
我觉得奇怪的是,我在第一步中已经有了IDWriteFontFace
,显然必须"返回"并要求字体集合提供IDWriteFont
,只是为了将其传递给DrawTextFormat
,然后可以用来DrawText
。这似乎不必要地复杂 - 特别是因为要绘制文本,系统可能无论如何都必须下降到IDWriteFontFace
,对吧?
我找到了DrawGlyphRun
,但这需要例如baselineOrigin
,我必须事先计算(更不用说glyphRun
本身了)。
如果我已经有IDWriteFontFace
,难道没有更简单的方法将文本绘制到ID2D1RenderTarget
上吗?
这是唯一的方法,就像你描述的那样。返回到构造文本格式实例,然后将其用于 DirectWrite 样式呈现。DrawGlyphRun
是一种低级方法,您当然可以使用它,但您必须自己实现很多布局逻辑,这是要避免的。一般来说,DrawText
是使用 Direct2D 呈现效率最低的方法,更好的方法是创建一次布局对象,并在每次需要重绘时使用它。
相关文章:
- 文本文件中的单词链表
- 从命令行c++发送文本文件名
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何根据单词在文本中出现的概率输出单词
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- C++试图读取一个文件并输出到另一个文本文件
- 如何通过套接字将文本文件的内容从服务器发送到客户端