c++ - ID2D1DeviceContext EndDraw D2DERR_WRONG_STATE 绘制矩形后

标签 c++ directx direct2d hresult drawrectangle

我尝试使用 Direct2D 绘制一个矩形。在初始化 Direct2D 设备和 Direct2D 设备上下文并设置渲染目标后,在下面描述 MSDN article ,我试着画了一个矩形如下:

  HRESULT result;
  result = g_d2dContext->CreateSolidColorBrush(
    D2D1::ColorF(D2D1::ColorF::Blue),
    &g_SolidBrush
    );

  D2D1_RECT_F rect = D2D1::RectF(
    g_targetRect.left + 10.0f,
    g_targetRect.top + 10.0f,
    g_targetRect.right - 10.0f,
    g_targetRect.bottom - 10.0f);

  g_d2dContext->BeginDraw();
  {
    g_d2dContext->DrawRectangle(rect, g_SolidBrush, 5.0f);
  }
  result = g_d2dContext->EndDraw();

  if (FAILED(result))
  {
    OutputDebugStringW(L"The object was not in the correct state to process the method.");
  }

EndDraw() 方法返回以下 HRESULT:0x88990001 (D2DERR_WRONG_STATE) - 对象未处于处理该方法的正确状态

矩形不会被绘制。我只得到一个黑色图像。

编辑:

我想问题是在调用 CreateBitmapFromDxgiSurface 后获得指向位图/渲染目标的 NULL 指针。

  g_d2dContext->CreateBitmapFromDxgiSurface(
    dxgiBackBuffer.Get(),
    &bitmapProperties,
    &g_targetBitmap);

  g_d2dContext->SetTarget(g_targetBitmap.Get());

但为什么 targetBitmap 为 NULL?

有什么想法吗?

提前致谢。

最佳答案

我刚刚解决了这个问题。我用错误的值初始化了 bitmapProperties。

现在可以了:

  D2D1_BITMAP_PROPERTIES1 bitmapProperties =
    D2D1::BitmapProperties1(
    D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,
    D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE),
    96.0f, // dpi
    96.0f  // dpi
    );

  // Direct2D needs the dxgi version of the backbuffer surface pointer.
  ComPtr<IDXGISurface> dxgiBackBuffer;
  hr = g_swapChain->GetBuffer(0, IID_PPV_ARGS(&dxgiBackBuffer));

  // Get a D2D surface from the DXGI back buffer to use as the D2D render target.
  hr = g_d2dContext->CreateBitmapFromDxgiSurface(
    dxgiBackBuffer.Get(),
    bitmapProperties,
    g_targetBitmap.GetAddressOf());

  // Now we can set the Direct2D render target.
  g_d2dContext->SetTarget(g_targetBitmap.Get());

关于c++ - ID2D1DeviceContext EndDraw D2DERR_WRONG_STATE 绘制矩形后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26107560/

相关文章:

c++ - Oculus Tiny Room,Directx,将 3D 模型加载到场景中

c++ - 重新分发 d3dcompiler_47.dll 时缺少 api-ms-win-core-libraryloader-l1-2-0.dll

c++ - HRESULT 0x8876086c D3DERR_INVALIDCALL with DirectX9 几乎遵循文档示例

c++ - DirectWrite:为拉丁文字和复杂文字使用不同的字体

c++ - gcc 在错误的目录下搜索头文件

c++ - 中断 accept()

c++ - 如何通过编程方式杀掉audiodg.exe进程?

c++ - 在 C++ 中使用 ADO 执行参数化查询时,为什么我不断收到 "Must declare the Scalar variable "@Param 1""?

c++ - CoCreate IWICImagingFactory 实例

c++ - 启动时不显示 Direct2D DC 上下文渲染图像