2016-03-28 4 views
-4

は、私は非常に単純なコードを持っている:
// CTORに:このオブジェクトを削除する必要はありますか? Direct2Dのを使用してMFCアプリケーションで

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

今の質問は、私はm_pBlackBrushに削除を呼び出すことになっていますか?もしそうならどこ?私はデストラクタでそれを削除しようとしましたが、私は書き込みアクセス違反があると言って私の顔に投げられたエラーを取得しています。誰かがこのブラシを削除するか、単にそれを残すことになっているかどうかを知っています(これはかなり奇妙な考えのようです)。ここで

+3

もちろん、このオブジェクトを 'new'を使って作成したときに' delete'する必要があります。そうしないと、メモリリークが発生します。 –

+2

これは使用方法によって異なる場合があります。 MFCにはオブジェクトの所有権に関する奇妙なアイデアがあったことを思い出しています。そのため、デバイスのコンテキストにそのブラシを置くと、所有権を引き受ける可能性があります。申し訳ありませんが詳細を思い出させません。 –

+0

@πάνταῥεmy私のポストを読んだ?私はそれに削除を呼び出そうとしましたが、私はエラーが発生しているので、ここでこの質問をします。 –

答えて

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

Createを呼び出す必要はありませんが、例をありがとう –

関連する問題