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

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

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

非常感谢您的热心帮助!

【问题讨论】:

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

标签: c++ fonts zooming gdi


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-03
      • 2011-04-02
      • 2018-07-10
      • 2016-03-17
      • 2012-11-07
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      相关资源
      最近更新 更多