2011-06-21 7 views
1

どこで、いつ、ビットマップを削除するには、私の質問はありますか?私は、メモリDCにビットマップを処理する機能を作成すると仮定し、(Windows)オブジェクトとデバイスのコンテキストをいつ削除しますか?

HBITMAP paint (HWND hwnd) 
{ 

HDC windc = ::GetWindowDC(hwnd); 
HDC memdc = ::CreateCompatibleDC(windc); 
HBITMAP bitmap = ::CreateCompatibleBitmap(windc,100,100); //Don't bother with the height and width 
::SelectObject(memdc,(HGDIOBJ)bitmap); 

/* DeleteDC(windc) here? */ 

//do the painting 
//... 
//painting done 

/*DeleteDC(memdc) here? */ 

return bitmap; 

/* Code does not reach here */ 
/* So where do I put DeleteObject(bitmap)? */ 
} 

それを返しますかまた、windcを削除するとmemdcに影響しますか?またはmemdcは純粋に作成されています(そして、windcに "ポイント"する情報は含まれていません)。それが本当であれば、ビットマップとmemdcが作成された後で(絵の前に)ウィンカーを削除することが適切です。

+0

重要 - GetWindowDCに対応するコールのためReleaseDCのを呼び出します。

::SelectObject(memdc,(HGDIOBJ)bitmap); //do the painting //... //painting done /*DeleteDC(memdc) here? */ return bitmap; 

あなたはこのような何かをしなければなりません。 (上のコードでは、DeleteDCを呼び出しています)。自分で作成したDC(CreateCompatibleDCなど)に対してのみDeleteDCを呼び出します。 – selbie

答えて

1
DeleteDC(windc); 

ReleaseDC(windc)に電話する必要があります。代わりに。

::CreateCompatibleDC(windc);の後には、windcは必要ありません。何が起こるか気にしません。 CreateCompatibleDCによって返されたHDCは、いくつかのパラメータ(デバイスに依存するピクセル表現など)を導出しますが、決してwindcを参照しません。

の代わりにこの:

HGDIOBJ prevBitmap = ::SelectObject(memdc,(HGDIOBJ)bitmap); 

//do the painting 
//... 
//painting done 

::SelectObject(memdc,prevBitmap); 
DeleteDC(memdc); 

return bitmap; 
+0

自分で作成したビットマップを削除する必要はありませんか? – biloon

+0

@biloon: "自分で作成したビットマップを削除する必要はありませんか?"もちろん、必要がなくなったらビットマップを削除する必要があります。しかし、あなたが関数からそれを返すと、なぜここでそれを削除したいのですか?ビットマップが終了したら、それを削除し、そのハンドルをその後のどこにも返さない(このハンドルはもはや有効ではない)。 –

関連する問題