ID2D1DeviceContext EndDraw D2DERR_WRONG_STATE после рисования прямоугольника

Я пытаюсь нарисовать прямоугольник, используя Direct2D. После инициализации устройства Direct2D и контекста устройства Direct2D и настройки цели рендеринга, описано в следующем Статья MSDN, Я попытался нарисовать прямоугольник следующим образом:

  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) - The object was not in the correct state to process the method,

Прямоугольник не будет нарисован. Я получаю только черное изображение.

РЕДАКТИРОВАТЬ:

Я полагаю, что проблема заключается в том, что после вызова CreateBitmapFromDxgiSurface получить нулевой указатель на цель точечного рисунка / рендеринга.

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

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

Но почему targetBitmap имеет значение NULL?

Есть идеи?

Заранее спасибо.

1

Решение

Я только что решил проблему. Я инициализировал 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());
0

Другие решения


По вопросам рекламы [email protected]