如何使用准确的 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 字体大小?的主要内容,如果未能解决你的问题,请参考以下文章