如何使用准确的 GDI 字体大小?

Posted

技术标签:

【中文标题】如何使用准确的 GDI 字体大小?【英文标题】:How to use accurate GDI font size? 【发布时间】:2017-06-14 04:22:19 【问题描述】:

一个普遍的问题:在GDI中,字体大小的类型是int,所以对于GDI在窗口中绘制的文本进行缩小/放大时并不准确,

有没有一种简单的方法可以在 GDI 中使用浮动字体大小来使字体大小准确?

非常感谢您的热心帮助!

【问题讨论】:

如果排版很重要,你不想使用现在已经过时的 GDI 甚至 GDI+,你会想要使用 Direct2D,它使用更现代、更好的文本引擎。 是的,谢谢,我现在正在尝试使用Direct2D,似乎可以输出正确的结果。 【参考方案1】:

使用CreateFont(和CreateFontIndirect),您可以指定以像素为单位的字体大小,因此无论缩放如何(在所选字体中可用大小的限制范围内),它都保持精确到像素——如果您使用位图字体,缩放可能受限或不存在)。

如果您使用CreatePointFont 创建字体,则以十分之一点为单位指定字体大小,通常小于一个像素,因此它会四舍五入到最接近的像素。但是,如果您确实想确保将高度指定为最接近的像素,那么您可能希望使用 CreateFont/CreateFontIndirect 而不是 CreatePointFont

【讨论】:

【参考方案2】:

GDI 文本不是线性缩放的,不仅因为它只使用整数大小,还因为提示试图使文本在以笔画宽度顺序呈现时看起来更好。如果将 GDI 字体的高度加倍,则宽度可能不会完全加倍。 GDI 文本曾经是硬件加速的,但不再是现代版本的 Windows。这对性能来说并不重要,因为它相对简单高效,而且硬件速度很快。

GDI+ 文本将线性缩放,因为将高度加倍会使宽度加倍(嗯,它真的 接近)。但是文本可能看起来“更模糊”,因为它使用灰度抗锯齿而不是 ClearType 子像素渲染。 GDI+ 文本往往比 GDI 慢,因为更多的工作是在软件中完成的。

DirectWrite(在 Direct2D 上运行)线性缩放,通常看起来非常好。编写高效的 Direct2D/DirectWrite 代码更加困难,并且根据您的要求,如果您还需要打印,您可能不得不退回到 GDI。如果您尝试编写 DPI 感知程序,您可能会发现自己必须在 DirectWrite 的设备无关坐标(用于图形)和鼠标坐标之间进行大量转换,这些坐标仍然与设备相关。 DirectWrite 是硬件加速的,所以 如果您通过缓存大量中间数据结构来有效地使用它会很快。

【讨论】:

以上是关于如何使用准确的 GDI 字体大小?的主要内容,如果未能解决你的问题,请参考以下文章

AGG第四十一课 AGG和GDI渲染字体大小对比

如何使用 TextRenderer 绘制多种大小的文本对齐? [复制]

如何查看计算的字体大小?

JDK:字体大小是如何生效的

VC6.0中加载图片并实现放大功能

调整大小后丑陋的字体,OpenGL