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

C++ 如何使用准确的GDI字体大小?,c++,fonts,zooming,gdi,C++,Fonts,Zooming,Gdi,一个常见的问题:在GDI中,字体大小的类型是int,因此当在窗口中对GDI绘制的文本进行缩小/放大时,它是不准确的 有没有一种简单的方法可以在GDI中使用浮动字体大小来保证字体大小的准确性 非常感谢你的帮助 使用CreateFont(和CreateFontIndirect)可以以像素为单位指定字体大小,因此无论缩放如何(在所选字体可用大小的限制范围内——如果使用位图字体,缩放可能会受到限制或不存在) 如果使用CreatePointFont创建字体,则以点的十分之一为单位指定字体大小,通常小于一个

一个常见的问题:在GDI中,字体大小的类型是int,因此当在窗口中对GDI绘制的文本进行缩小/放大时,它是不准确的

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


非常感谢你的帮助

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


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

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


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

GDI文本不会线性缩放,这不仅仅是因为它只使用整数大小,但也因为暗示,当以笔划宽度顺序的分辨率渲染文本时,它试图使文本看起来更好。如果将GDI字体的高度加倍,则宽度可能不会完全加倍。GDI文本曾经是硬件加速的,但现在已经不在现代版本的Windows上了。这对性能没有多大影响,因为它相对简单高效,而且硬件速度快

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


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

GDI文本不会线性缩放,这不仅是因为它只使用整数大小,而且还因为暗示,当以笔划宽度的顺序以分辨率渲染文本时,它试图使文本看起来更好。如果将GDI字体的高度加倍,则宽度可能不会完全加倍。GDI文本曾经是硬件加速的,但现在已经不在现代版本的Windows上了。这对性能没有多大影响,因为它相对简单高效,而且硬件速度快

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


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

如果排版很重要,您不想使用现在已经非常过时的GDI,甚至GDI+,您会希望使用Direct2D,它使用更现代、更好的文本引擎。是的,谢谢,我现在正在尝试使用Direct2D,它似乎可以输出正确的结果。如果排版很重要,你不想使用现在已经非常过时的GDI甚至GDI+,你应该使用Direct2D,它使用更现代、更好的文本引擎。是的,谢谢,我现在正在尝试使用Direct2D,似乎可以输出正确的结果。