【问题标题】:Text drawn with DWrite is blurry用 DWrite 绘制的文字模糊
【发布时间】:2019-02-01 10:35:52
【问题描述】:

我最近正在开发自己的 GUI 库。该窗口是使用 Win32 API 创建的,然后在其中创建 Direct2D RenderTarget。所有绘图(按钮、标签等)都发生在 RenderTarget 内。一切都很好,除了文字质量。例如,当我查看 Visual Studio 按钮时,与 DirectWrite 方法 DrawTextW() 相比,文本看起来非常清晰。

这是一个图像示例:

我使用 DirectWrite 直接绘制文本。 `

ID2D1SolidColorBrush* brush;
RenderTarget->CreateSolidColorBrush(D2D1::ColorF(red, green, blue, alpha), &brush);

IDWriteTextFormat* format;
HRESULT h = WriteFactory->CreateTextFormat(std::wstring(font.begin(), font.end()).c_str(), NULL, fontWeight,
    fontStyle, DWRITE_FONT_STRETCH_NORMAL, fontSize, L"", &format);

// Center the text horizontally and vertically.
format->SetTextAlignment(textAllignment);
format->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER);

// Draw text
RenderTarget->DrawTextW(std::wstring(text.begin(), text.end()).c_str(), std::wstring(text.begin(), text.end()).size(), format, D2D1::RectF(xPos, yPos, xPos+width, yPos+height), brush);

brush->Release();
format->Release();

`

我只是想知道,这是我应该接受并继续前进的事情,还是我必须使用 DWriteFactory 进行一些调整?

【问题讨论】:

  • 这看起来您正在以 HighDPI 模式运行 Windows,但您的应用程序不是 DPI aware

标签: c++ direct2d directwrite


【解决方案1】:

您似乎拥有高 DPI 监视器,但尚未为您的可执行文件定义正确的清单。默认情况下,Windows 会认为您的应用是为旧的 96ppi 系统设计的,因此如果您的显示器使用 192ppi,则每个“像素”将跨越四个物理像素。

检查this for how to add high-DPI awareness 到您的应用程序。

在 Visual Studio 2015 及更高版本中,项目设置中有一个标志:“配置属性 > 清单工具 > 输入和输出 > DPI 感知”

【讨论】:

  • 非常感谢您的回复,但我有一个问题。如果它是一个清单文件并且必须包含在项目中,这是否意味着每次有人想使用我的库时都必须创建这个清单文件?
  • “清单文件,必须包含在内” - 这是非常可取的,因为这个标志会影响很多事情。例如。窗口标题和按钮的大小。然而,应用程序使用的常见对话框等。您可以通过编程方式执行此操作,但此设置是全局进程:docs.microsoft.com/en-us/windows/desktop/api/shellscalingapi/…
  • 感谢您提供的信息,我回家后会测试您的解决方案,但这听起来像是一个答案:)
  • 请注意,如果框架窗口(具有桌面父级的窗口)使用 WM_NOREDIRECTIONBITMAP,则可以实现最佳结果(最快绘制),我在这里解释过:sciter.com/sciter-4-2-support-of-acrylic-theming
猜你喜欢
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多