ビットマップを破棄するとき、CDCから選択解除したい。

[戻る]
ダイザ [HomePage] 2004/04/04(日) 09:58:37
ビットマップを破棄するときは、CDCから選択解除したいのですが、
CDC::DeleteDC()をつかえばよろしいのでしょか?

     CBitmap wBitmap ;
    wBitmap.CreateCompatibleBitmap(pDC,1024,512) ; //カンバスを作成
 
    CDC dc;
    dc.CreateCompatibleDC(pDC);    // メモリデバイスコンテキストを作成します。
  dc.SelectObject(&wBitmap) ; // カンバスを選択
  CRect    wRect(0,0,200,200) ;// 矩形領域を設定
  CRgn    wRgn ;
  CBrush wBrush ;
  wBrush.CreateSolidBrush(0xff0000) ;// ブラシの色に青を選択

  wRgn.CreateEllipticRgn(0,0,wRect.right,wRect.bottom) ;//(楕)円を表示
  dc.SelectObject(&wBrush) ;        
  dc.PaintRgn(&wRgn) ;
    pDC->BitBlt(0, 0, wRect.right, wRect.bottom, &dc, 0, 0, SRCCOPY);

  // メモリデバイスコンテキストを削除します。
    dc.DeleteDC();// これで、カンバスの選択をはずしたことになるのでしょうか?

dairygoods 2004/04/04(日) 10:31:55
デバイスコンテキストに選択したGDIオブジェクトは、
すべて破棄する前に元に戻さなければなりません。

// ビットマップを選択し、もともと選択されていたビットマップを保持しておく。
COldBitmap* pOldBmp = dc.SelectObject(&wBitmap) ; 
...
// もともとのビットマップを選択しなおす。自分が選択したものは解除される。
dc.SelectObject(pOldBmp);

dc.DelecteDC();

ブラシも(ペンやフォントなども)同様です。
解除しないと破棄できず、リソースリークします。

選択するものが多すぎて一つずつ元に戻すのが面倒でしたら、
SaveDC()とRestoreDC()を使う方法もあります。

古いスレッドには追加発言できません。