奇怪的CBitmapRenderTarget::GetBitmap API-Direct2D MFC

奇怪的CBitmapRenderTarget::GetBitmap API-Direct2D MFC,mfc,direct2,Mfc,Direct2,我完全被directd2d接口的MFC包装搞糊涂了。请看以下示例:- BOOL CreateCompatibleRenderTarget( CBitmapRenderTarget& bitmapTarget, CD2DSizeF sizeDesired = CD2DSizeF(0., 0.), CD2DSizeU sizePixelDesired = CD2DSizeU(0, 0), D2D1_PIXEL_FORMAT* desiredFormat =

我完全被directd2d接口的MFC包装搞糊涂了。请看以下示例:-

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是使用默认Constructor创建的对象。但是,这不适用于CBitmapRenderTarget的GetBimap成员,该成员在文档中也遵循相同的模式:-

BOOL GetBitmap(
   CD2DBitmap& bitmap
);
位图此方法返回时,包含此方法的有效位图 渲染目标。此位图可用于绘图操作


但是CD2DBitmap没有默认的ctor,因此我无法首先创建对象。问题是如何正确调用CBITMapRenderTargetAPI的GetBitmap。如何创建未初始化的CD2DBitmap对象?

我遇到了同样的问题。看看CD2DB位图实现,并没有并没有不带参数的构造函数,只有父CRenderTarget*的构造函数是一个参数,但它受到保护,所以不能从外部使用。因此,显然唯一的方法是使用3个公共构造函数中的一个,它们只从现有资源(从句柄、资源id或文件路径)中装入位图

在我的情况下,作为一种解决方法,因为我的目的是用一个新的bitbap(GetBitmap)替换此bitbap,所以我从存储在我的资源中的PNG文件创建了Bitamp:

    CD2DBitmap bitmap(GetRenderTarget(), (UINT)IDB_LOGO_PETIT, _T("PNG"));
    m_pTraceRenderTarget->GetBitmap(bitmap);
但您可以使用任何其他CD2DBMAPT构造函数:

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);

我遇到了同样的问题。看看CD2DB位图实现,并没有并没有不带参数的构造函数,只有父CRenderTarget*的构造函数是一个参数,但它受到保护,所以不能从外部使用。因此,显然唯一的方法是使用3个公共构造函数中的一个,它们只从现有资源(从句柄、资源id或文件路径)中装入位图

在我的情况下,作为一种解决方法,因为我的目的是用一个新的bitbap(GetBitmap)替换此bitbap,所以我从存储在我的资源中的PNG文件创建了Bitamp:

    CD2DBitmap bitmap(GetRenderTarget(), (UINT)IDB_LOGO_PETIT, _T("PNG"));
    m_pTraceRenderTarget->GetBitmap(bitmap);
但您可以使用任何其他CD2DBMAPT构造函数:

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);

当我在写答案时,我意识到可能还有另一种方法:编写自己的类并从CD2DBitmap继承,这样就可以自定义构造函数。。。未经测试,但已编译。类CMyBitmap:public CD2DBitmap{public:CMyBitmap(CRenderTarget*pParentTarget):CD2DBitmap(pParentTarget){};}当我写答案时,我意识到可能还有另一种方法:编写您自己的类并从CD2DBitmap继承,这样您就可以自定义构造函数。。。未经测试,但已编译。类CMyBitmap:public CD2DBitmap{public:CMyBitmap(CRenderTarget*pParentTarget):CD2DBitmap(pParentTarget){};}当我写答案时,我意识到可能还有另一种方法:编写您自己的类并从CD2DBitmap继承,这样您就可以自定义构造函数。。。未经测试,但已编译。类CMyBitmap:public CD2DBitmap{public:CMyBitmap(CRenderTarget*pParentTarget):CD2DBitmap(pParentTarget){};}