DirectX D2 Неправильная однобуферная прорисовка
От: Melamed Россия  
Дата: 18.09.23 11:05
Оценка:
Следующий код должен из интерфейса ID2D1Bitmap получить GDI HBITMAP

LRESULT CImageBrowser::OnGetHBitmap()
{
    D2D1_SIZE_F size = m_Bitmap.GetSize();
    ID2D1FactoryPtr Factory;
    ID2D1Factory1Ptr Factory1;
    m_Bitmap.GetFactoty(&Factory);
    Check_Com(Factory->QueryInterface(IID_PPV_ARGS(&Factory1)));
    ID2D1DCRenderTargetPtr DCRenderTarget;
    D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
        D2D1_RENDER_TARGET_TYPE_DEFAULT,
        D2D1::PixelFormat(
            DXGI_FORMAT_B8G8R8A8_UNORM,
            D2D1_ALPHA_MODE_IGNORE),
        0,
        0,
        D2D1_RENDER_TARGET_USAGE_NONE,
        D2D1_FEATURE_LEVEL_DEFAULT
    );

    Check_Com(
        Factory1->CreateDCRenderTarget(
            &props,
            &DCRenderTarget
        )
    );
    HDC hDCSource;
    Check_Win(hDCSource = CreateCompatibleDC(nullptr));
    MVRECT mvRect;
    mvRect.right = (int)size.width;
    mvRect.bottom = (int)size.height;
    Check_Com(DCRenderTarget->BindDC(hDCSource, mvRect));
    D2D1_RECT_F rect = D2D1::RectF(0.0, 0.0, (float)size.width, (float)size.height);
    DCRenderTarget->BeginDraw();
    DCRenderTarget->DrawBitmap(m_Bitmap, rect);
    
    Check_Com(DCRenderTarget->EndDraw());
    HDC hDCResult;
    Check_Win(hDCResult = CreateCompatibleDC(nullptr));
    HBITMAP hBitmap; 
    Check_Win(hBitmap = CreateCompatibleBitmap(nullptr,(int)size.width,(int)size.height));
    HBITMAP hOldBitmap = (HBITMAP)SelectObject(hDCResult, hBitmap);
    BitBlt(
        hDCResult,
        0,
        0,
        (int)size.width,
        (int)size.height,
        hDCSource,
        0,
        0,
        SRCCOPY
    );
    SelectObject(hDCResult, hOldBitmap);
    DeleteDC(hDCResult);
    DeleteDC(hDCResult);
    return (HRESULT)hBitmap;
}


В выделенной строке жирным шрифтом возникает сообщение с кодом 0x88990015. Моя программа дает сообщение, полученное с помощью функции FormatMessage, следующее "Ресурс был создан с использованием неправильной однобуферной прорисовкой.
Еще что интересно, что на сайте Микрософт сообщение ошибки с таким же кодом дается такое "Используемый ресурс был создан целевым объектом отрисовки в другом домене ресурсов." Коды ошибок Direct2D
Как бороться с этой ошибкой
Re: DirectX D2 Неправильная однобуферная прорисовка
От: r0nd  
Дата: 05.10.23 16:19
Оценка:
Здравствуйте, Melamed, Вы писали:

M>Как бороться с этой ошибкой


Ошибка с кодом 0x88990015 ("Ресурс был создан с использованием неправильной однобуферной прорисовкой" или "Используемый ресурс был создан целевым объектом отрисовки в другом домене ресурсов") связана с тем, что вы пытаетесь создать ресурс с использованием объекта отрисовки (render target), который был создан в другом домене ресурсов.

Домен ресурсов в Direct2D представляет собой контекст, в котором создаются и используются ресурсы (например, битмапы и др.). Ваша ошибка может возникнуть, если объект m_Bitmap был создан в одном домене ресурсов, а объект DCRenderTarget был создан в другом.

Чтобы решить эту проблему, убедитесь, что объекты m_Bitmap и DCRenderTarget были созданы в одном и том же домене ресурсов.
...<< Dementor 1.4.3 ✪ Lets Play a Game ⚁⚁⚂⚃⚅>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.