2016-03-28 280 views
-4

在使用Direct2D的MFC应用程序中我有非常简单的代码:
//在构造函数:我是否需要删除此对象?

EnableD2DSupport(); 
m_pBlackBrush = new CD2DSolidColorBrush(GetRenderTarget(), D2D1::ColorF(D2D1::ColorF::Black)); 

现在的问题是,我应该打电话给删除m_pBlackBrush?如果是这样的话?我试图在析构函数上调用delete,但我得到的错误表明存在写访问冲突。任何人都知道我是否应该删除这个画笔或者干脆离开它(这看起来很奇怪)?

+3

确定你需要'删除'这个对象,当你使用'new'创建它时,否则你会有内存泄漏。 –

+2

这可能取决于你如何使用它。我记得MFC有关于对象所有权的奇怪想法,因此,如果您将该笔刷放在设备上下文中,它可能会承担所有权。对不起,我不记得细节。 –

+0

@πάνταῥεῖ你读过我的文章了吗?我试着打电话给它删除,但我得到错误,这就是为什么我在这里问这个问题 –

回答

4

此构造方法的签名是:

CD2DSolidColorBrush(
    CRenderTarget* pParentTarget, 
    D2D1_COLOR_F color, 
    CD2DBrushProperties* pBrushProperties = NULL, 
    BOOL bAutoDestroy = TRUE 
); 

注意最后一个参数。从MSDN(CD2DSolidColorBrush::CD2DSolidColorBrush):

bAutoDestroy
指示对象将通过所有者(pParentTarget)被破坏。

-1

这里的Direct2D对象的小样本的工作:

CChildView::CChildView() 
: m_pBitmamLogo(NULL), 
    m_pBrushBackground(NULL) 
{ 
} 

HRESULT CChildView::_LoadBackgroundBrush(CHwndRenderTarget* pRenderTarget) 
{ 
ASSERT_VALID(pRenderTarget); 

// Create and load a Direct2D brush from a "PNG" resource 
// NOTE: D2D1_EXTEND_MODE_WRAP repeats the brush's content 
m_pBrushBackground = new CD2DBitmapBrush(pRenderTarget, // render target 
    IDB_PNG_BACKGROUND,         // resource ID 
    _T("PNG"),           // resource type 
    CD2DSizeU(0, 0), 
    &D2D1::BitmapBrushProperties(D2D1_EXTEND_MODE_WRAP, 
    D2D1_EXTEND_MODE_WRAP)); 

return m_pBrushBackground->Create(pRenderTarget); 
} 

CChildView::~CChildView() 
{ 
// No need to free Direct2D resources 
// because they are automatically destroyed by the parent render target 
} 

来源: http://codexpert.ro/blog/2016/01/18/easy-png-resource-loading-with-mfc/

+0

您不必致电创建,但非常感谢您的举例 –

相关问题