2016-03-28 108 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

您不必致電創建,但非常感謝您的舉例 –

相關問題