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

时间:2017-01-28 15:49:29

标签: c++ fonts zoom gdi

一般问题:在GDI中,字体大小的类型是int,所以当缩小/放大GDI在窗口中绘制的文本时,它是不准确的,

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

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

使用CreateFont(和CreateFontIndirect)指定字体大小(以像素为单位),因此无论缩放如何(在所选字体中可用尺寸的限制范围内),它都会保持对像素的准确性 - 如果使用位图字体,则缩放可能有限或不存在。)

如果您使用CreatePointFont创建字体,则指定字体大小(以十分之一为单位),通常小于一个像素,因此它会舍入到最近的像素。但是,如果您确实要确定要将高度指定为最近的像素,则可能需要使用CreateFont / CreateFontIndirect而不是CreatePointFont

答案 1 :(得分:0)

GDI文本不是线性缩放,而是因为它仅使用整数大小,而且还因为提示在尝试以其笔画宽度顺序的分辨率渲染时使文本看起来更好。如果将GDI字体的高度加倍,则宽度可能不会精确加倍。 GDI文本曾经硬件加速但不再适用于现代版本的Windows。这对性能无关紧要,因为它相对简单高效,而且硬件速度快。

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

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