2014-09-29 6 views
1

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

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.

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

EDIT:

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

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

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

Но почему targetBitmap NULL?

Любые идеи?

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

ответ

0

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