RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1204199
Accepted
Barracudach
Barracudach
Asked:2021-11-13 22:29:03 +0000 UTC2021-11-13 22:29:03 +0000 UTC 2021-11-13 22:29:03 +0000 UTC

缓冲区与指定的参数不匹配 Dpi 的问题

  • 772

我正在制作一个程序,将在目标窗口顶部绘制我需要的东西,但是当我绘制时,绘图会转到我指定的错误坐标。此外,由于某种原因,缓冲区大小与我设置了。所以我初始化 d2d:

ID2D1Factory* pFactory;
ID2D1HwndRenderTarget* pRenderTarget;
ID2D1SolidColorBrush* ColorBrush;

bool init_render()
{
    D2D1_FACTORY_OPTIONS CreateOpt = { D2D1_DEBUG_LEVEL_NONE };
    if (S_OK != D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, __uuidof(ID2D1Factory), &CreateOpt, (void**)&pFactory))
    {
        MessageBox(0, "D2D1CreateFactory", "ERROR", MB_OK | MB_ICONERROR);
        return 0;
    }
    create_canvas();
    return 1;
}
void create_canvas()
{
    RECT rc;
    GetClientRect(targetHWND, &rc);
    //std::cout<< rc.right - rc.left <<" "<< rc.bottom - rc.top<<std::endl;

    pFactory->CreateHwndRenderTarget(
        D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_HARDWARE, D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED)),//D2D1_RENDER_TARGET_TYPE_DEFAULT
        D2D1::HwndRenderTargetProperties(myHWND, D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top)),
        &pRenderTarget);
    pRenderTarget->CreateSolidColorBrush(color_brush, &ColorBrush);
}

我在循环中将窗口的大小调整为我们将在其上绘制的窗口的大小。当目标窗口大小发生变化时,我还会在窗口的消息处理程序中更改缓冲区大小:

LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_SIZE:
        if (pRenderTarget != NULL)pRenderTarget->Resize(D2D1::SizeU((UINT)LOWORD(lParam), (UINT)HIWORD(lParam)));
        return 0;
    case WM_SYSCOMMAND:
        if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
            return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
}

但是如果你得到缓冲区的大小,那么它不等于我为它设置的大小,更准确地说,它不等于目标窗口的大小(以像素为单位):

void rect(float x,float y,float h,float w) {
    D2D1_SIZE_F rtSize= pRenderTarget->GetSize();//получаем размер буфера 
    int width = static_cast<int>(rtSize.width);
    int height = static_cast<int>(rtSize.height);
    std::cout <<"Render target: "<< width<<" " << height << std::endl;//выводим размер буфера

    ColorBrush->SetColor({0.0f,1.0f,0.0f,1.0f});
    pRenderTarget->DrawRectangle(D2D1::RectF(x, y, x+h, y+w), ColorBrush,1.0f);//пробуем рисовать по заданным координатам
}

结果缓冲区的大小不合适,绘制的地方也不是我设置的,效果就好像我说要绘制的坐标(以像素为单位)大了一倍半(大约)。

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Barracudach
    2021-11-16T02:27:34Z2021-11-16T02:27:34Z

    我挖了一圈,找到了答案。原来,windows使用缩放,当用户设置一个大于100%的值时,系统dpi会发生变化。当我们创建directx上下文时,它默认使用系统dpi。设置手动 dpi(在我的情况下,你需要 100% 是水平和垂直 96dpi,因为我有方形像素),你必须ID2D1RenderTarget在界面中手动设置 dpi:

    pRenderTarget->SetDpi(96, 96);
    

    或在初始化时:

    pFactory->CreateHwndRenderTarget(
            D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_HARDWARE, D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED),96,96),//D2D1_RENDER_TARGET_TYPE_DEFAULT
            D2D1::HwndRenderTargetProperties(cheatEspHWND, D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top)),
            &pRenderTarget);
    

    感谢@Qwertiy 的建议性回答。

    • 4

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5