Странный CBitmapRenderTarget:: API GetBitmap - Direct2D MFC

Я полностью сбит с толку MFC-оберткой для DirectD2D-интерфейсов. Например, посмотрите на следующее:

BOOL CreateCompatibleRenderTarget(
   CBitmapRenderTarget& bitmapTarget,
   CD2DSizeF sizeDesired = CD2DSizeF(0.,
   0.),
   CD2DSizeU sizePixelDesired = CD2DSizeU(0,
   0),
   D2D1_PIXEL_FORMAT* desiredFormat = NULL,
   D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options = D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE
);

bitmapTarget Когда этот метод возвращается, содержит адрес указателя на новую цель рендеринга растрового изображения. Этот параметр передается неинициализированным.

Я полностью озадачен тем, что я должен передать функции. Так как в отличие от документации он получает объект, а не указатель на неинициализированный, как в Directd2d IDL. И объект должен быть инициализирован.

Теперь можно сказать, что CBitmapRenderTarget - это объект, созданный с помощью contstructor по умолчанию. Однако это не работает с членом GetBimap CBitmapRenderTarget, который также следует той же схеме в документации:

BOOL GetBitmap(
   CD2DBitmap& bitmap
);

Растровое изображение Когда этот метод возвращается, содержит действительное растровое изображение для этой цели рендеринга. Это растровое изображение можно использовать для операций рисования.

Однако CD2DBitmap НЕ ИМЕЕТ ctor по умолчанию, поэтому я не могу создать объект в первую очередь. Вопрос в том, как правильно вызвать GetBitmap API CBitmapRenderTarget. Как мне создать неинициализированный объект CD2DBitmap???

1 ответ

Я столкнулся с той же проблемой. Глядя на реализацию CD2DBitmap, не существует конструктора без аргумента, а тот, у которого есть только родительский CRenderTarget* и аргумент, но он защищен, поэтому его нельзя использовать извне. Таким образом, очевидно, единственный способ - использовать один из 3 открытых конструкторов, которые только создают Bitmap из существующих ресурсов (из дескриптора, идентификатора ресурса или пути к файлу).

В моем случае, в качестве обходного пути, поскольку я намереваюсь заменить этот битпап новым (GetBitmap), я создал битамп из файла PNG, хранящегося на моих ресурсах:

    CD2DBitmap bitmap(GetRenderTarget(), (UINT)IDB_LOGO_PETIT, _T("PNG"));
    m_pTraceRenderTarget->GetBitmap(bitmap);

Но вы можете использовать любой другой конструктор CD2DBitmap:

CD2DBitmap(CRenderTarget* pParentTarget, UINT uiResID, LPCTSTR lpszType = NULL, CD2DSizeU sizeDest = CD2DSizeU(0, 0), BOOL bAutoDestroy = TRUE);
CD2DBitmap(CRenderTarget* pParentTarget, LPCTSTR lpszPath, CD2DSizeU sizeDest = CD2DSizeU(0, 0), BOOL bAutoDestroy = TRUE);
CD2DBitmap(CRenderTarget* pParentTarget, HBITMAP hbmpSrc, CD2DSizeU sizeDest = CD2DSizeU(0, 0), BOOL bAutoDestroy = TRUE);
Другие вопросы по тегам