c++ - Direct2D 接口(interface)和模糊文本问题

标签 c++ windows gdi direct2d

我的新应用程序将具有一个丰富的界面,该界面应该可以动态调整大小,使用透明图标/图像等。对于这个应用程序,我正在尝试决定使用新的 Direct2D。针对旧的 GDI 的 API。缺点之一当然是它不能在 XP 上运行,尽管我发现了一些更棘手的问题需要决定:

  1. 我注意到在 Direct2D 环境中输出文本似乎有点模糊(尽管作为一项功能进行销售)。只需在启用了硬件加速的 Firefox 4(或 IE9)中查看文本即可。这似乎是由于在 Direct2D 文本中 does not adhere to the (pixel) grid就像 GDI 一样。有没有办法强制 Direct2D 使其粘附在像素网格上,从而解决这个问题?

  2. 速度真的有这样的提升吗?我试图理解this文章以及我从中得出的结论是,在 Windows 7 和 XP(不是 Vista?)中,GDI 已经在可能的地方进行了硬件加速。例如。在我的应用程序中,我使用了很多内存 DC,它们只是 BitBlt 到位并使用 AlphaBlend 绘制透明图像/抗锯齿线等。最后一个肯定是硬件加速的,因为我在测试例程时测量了速度。

那么你会把钱放在哪里? Direct2D 是否值得麻烦,还是您会坚持使用良好的旧 GDI?或者您会提出其他建议吗?

注意:顺便说一下,我是用 C++ 编程的,没有使用 MFC。

最佳答案

解决您的问题非常简单。 Direct2D 是高度可配置的,包括文本呈现和提示。如果你想让它呈现文本以匹配 GDI 的呈现(即非常紧密的像素对齐),只需:

  • 在呈现目标上调用 SetTextRenderingParams 函数 http://msdn.microsoft.com/en-us/library/windows/desktop/dd316898%28v=vs.85%29.aspx
  • 传入一个 IDWriteRenderingParams,您可以在该 IDWriteRenderingParams 上调用 SetRenderingMode,其值为 GDI_CLASSIC 或 GDI_NATURAL(建议使用自然值)。该对象还可以通过多种其他方式进行配置,包括可变的 ClearType、 Gamma 和对比度。

由于其他答案毫无帮助并且破坏了 Direct2D 中的呈现,因此让我提供 Direct2D 文本呈现的另一个概述。非常非常好。与在 Mac 上不同,在 Mac 上,它们基本上不提示字体并且文本实际上变得模糊,默认情况下,Direct2D 仅在 Y 方向上强烈提示。这是有道理的,因为您的显示器可能有大约 96 dpi 的垂直分辨率,但使用亚像素抗锯齿后,水平分辨率超出了人类感知的合理范围。与 GDI 相比,它在 ClearType 用法和提示方面也更加微妙。与 Direct2D 相比,GDI 文本的边缘往往色彩丰富。我发现现在的 GDI 文本看起来非常粗糙,更喜欢 Firefox 和 IE 中的 Direct2D 文本来进行长时间阅读。

因此,有多种原因可能导致默认模式对您来说显得“模糊”。

  1. 首先,花时间在控制面板中运行 ClearType 调谐器程序。您会惊讶于 Direct2D 程序的不同之处。
  2. 无论它有多好,当您将它放在应用程序中以 GDI 间隔的文本旁边时,它总是会显得很奇怪。尝试使 UI 中的所有内容都成为一个或另一个,或者将内容区域与其他区域清楚地区分开来。如果您决定将所有内容都设为 GDI 间距,只需使用我上面描述的方法将 Direct2D 设置为 GDI 间距文本模式。
  3. 您尚未从 Windows Update 安装所有可用的更新。有几个用于 DirectWrite 和 IE。确保全部安装并重新启动以查看改进。
  4. 你只是还没有习惯。
  5. 它在你的脑海中。真的。一旦开始大量考虑文本渲染,您可能会发现自己注意到了不存在的“问题”。这个问题的另一个答案是完美的例子。他表示,他认为 Visual Studio 2010 中的文本比 2008 年更加模糊,但它们实际上是 像素完美 的拷贝。不相信我? VS 开发人员实际上自己提供了一些比较。我敢打赌你分不出区别。 http://blogs.msdn.com/b/text/archive/2010/03/05/additional-wpf-text-clarity-improvements.aspx

关于c++ - Direct2D 接口(interface)和模糊文本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7498553/

相关文章:

c++ - 将 .so 和 .a 库添加到 Makefile

linux - "Modern"带有 GLFW 的 Linux 上的 OpenGL

c++ - 使用 Win32 API 和 GDI 绘制窗口的无效区域

c++ - 如何获取所有系统进程的GuiResources?

c++ - 如何参数化用作另一个 lambda 参数的 lambda

c++ - C++中指向数组与字符串的指针的大小

c++ - 如何调试固件-Orion

java - 使用 JNA 解密使用 MS DPAPI 加密的数据

php 崩溃并且 rdp 不可用

c - GetPixel优化winapi