为啥 direct2d 看起来像素化且不准确?

Posted

技术标签:

【中文标题】为啥 direct2d 看起来像素化且不准确?【英文标题】:Why does direct2d look pixelated and inaccurate?为什么 direct2d 看起来像素化且不准确? 【发布时间】:2022-01-21 00:01:28 【问题描述】:

我创建了一个分层窗口并添加了一些圆角矩形、椭圆和文本来制作一个自定义窗口。

简而言之,我是这样写的:


D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &d2dFactory);

d2dFactory->CreateHwndRenderTarget
    (
        RenderTargetProperties(),
        HwndRenderTargetProperties(hwnd, SizeU(clientRect.right, clientRect.bottom)),
        &pRenderTarget
    );

...

DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(dWriteFactory), reinterpret_cast<IUnknown**>(&dWriteFactory));

dWriteFactory->CreateTextFormat
    (
        L"Calibri",
        NULL,
        DWRITE_FONT_WEIGHT_NORMAL,
        DWRITE_FONT_STYLE_NORMAL,
        DWRITE_FONT_STRETCH_NORMAL,
        14.0f,
        L"en-us",
        &pTextFormat
    );

...

D2D1_ROUNDED_RECT roundedRect = RoundedRect
    (
        RectF
        (
            clientRect.left,
            clientRect.top,
            clientRect.right,
            clientRect.bottom
        ),
        20, 20
    );

...

pRenderTarget->BeginDraw();

...

pRenderTarget->FillRoundedRectangle
    (
        roundedRect,
        SCB_DARK_BLUE
    );

pRenderTarget->DrawTextA
    (
        title,
        titleSize,
        pTextFormat,
        RectF(185, 2, 255, 2),
        SCB_WHITE
    );

pRenderTarget->FillEllipse
    (
        Ellipse
        (
            Point2F(20, 10),
            6, 6
        ),
        SCB_RED
    );

我遵循了微软的文档。

The window looks like this

它的像素大小为 300 x 400。 文本、角和椭圆看起来像素化且不准确。

我的程序中缺少什么?提前致谢。

【问题讨论】:

【参考方案1】:

您的程序是否设置为高 DPI 感知?请注意,我是盲人,因此看不到您的屏幕截图,但这是我从您的描述中想到的第一件事。

如果使用 Visual Studio,请转到项目-> 属性然后清单工具-> 输入和输出并检查“DPI 感知”设置。它应该是“High DPI Aware”或“Per Monitor High DPI Aware”。

【讨论】:

嘿,解决了!谢谢!

以上是关于为啥 direct2d 看起来像素化且不准确?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Direct2D 从窗口中获取像素

Direct2D坐标错误

GDI InvertRect 的 Direct2D 等效项

为啥`1vh` CSS大小解析为屏幕上不同的像素大小

Direct2D教程渲染位图

需求分析