DeleteObject()やDeleteDC()の呼び出しが必要な場合


うーん  2007-11-29 19:40:16  No: 67046

お世話になります.あるサイトを参考にメモリDCの勉強をしているのですが,DeleteObject()やDeleteDC()の呼び出しがどういう場合に必要なのか
わかりません。MSDNを見てもどういう場合に呼び出しが必要か明確に書いて
ないようです。

質問したいことは、下記のコードに関する以下の点です。

(1) 参考にしたサイトによると、①でビットマップオブジェクトをnewして
②のpBMP->DeleteObject()でビットマップオブジェクトを解放すると
あったのですが、解放は③のdelete pBMPで行なうべきではないで
しょうか?

(2) CBitmapオブジェクトのデストラクタの中にはDeleteObject()が記述され
ているのでしょうか?記述されているのならDeleteObject()の呼び出しは必要
ないように思うのですが。それとも、CreateCompatibleBitmap()を呼び出した
場合には必ずDeleteobject()を呼び出すことになっているのでしょうか?

(3) ④のDeleteDC()もデストラクタ中に記述されているなら呼び出す必要
がないと思いますが。 

環境はVC++2005、MFCです。よろしくお願い致します。

void CmdcView::OnDraw(CDC* pDC)
{
       ...
      CDC mDC;
      mDC.CreateCompatibleDC(pDC);

      CBitmap *pBMP, *pOldBMP;
      pBMP=new CBitmap;                  //  ①    
      pBMP->CreateCompatibleBitmap(pDC, 256, 128);  
      pOldBMP=mDC.SelectObject(pBMP);

      mDC.FillSolidRect(0,0,256,128,RGB(255,0,0));
      pDC->BitBlt(100,100,256,128,&mDC,0,0,SRCCOPY);
      
      mDC.SelectObject(pOldBMP);
      pBMP->DeleteObject();              //  ②
      delete pBMP;                       //  ③

      mDC.DeleteDC()                     //  ④
}


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加