C++ 使用DWrite绘制的文本模糊

C++ 使用DWrite绘制的文本模糊,c++,direct2d,directwrite,C++,Direct2d,Directwrite,我最近正在开发自己的GUI库。该窗口是使用Win32 API创建的,然后在其中创建Direct2D RenderTarget。所有图形(按钮、标签等)都发生在渲染目标内部。除了文字的质量外,一切都很好。例如,当我查看visual studio按钮时,与DirectWrite方法DrawTextW()相比,文本看起来非常清晰 下面是一个图像示例: 我使用DirectWrite直接绘制文本。 ` ` 我只是想知道,这是我应该接受并继续的东西,还是我必须用DWriteFactory调整一些东西?似乎

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

下面是一个图像示例:

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

`


我只是想知道,这是我应该接受并继续的东西,还是我必须用DWriteFactory调整一些东西?

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

检查你的申请


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

非常感谢您的回复,但我有一个问题。如果它是一个清单文件并且必须包含在项目中,这是否意味着每次有人想要使用我的库时都必须创建这个清单文件?“清单文件并且必须包含”-这是非常可取的,因为这个标志会影响很多事情。例如,窗口标题和按钮的大小。但是,应用程序使用的常见对话框等。您可以通过编程方式完成此操作,但此设置是全局过程:谢谢您提供的信息,我回家后将测试您的解决方案,但这听起来像是一个答案:)请注意,如果框架窗口(具有桌面父窗口的窗口)可以获得最佳结果(最快的绘图)正在使用WM_NOREDIRECTIONBITMAP,我已经在这里解释过了:这看起来像是在HighDPI模式下运行Windows,但应用程序不是。
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();