2011-06-21 34 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後(在任何繪畫之前)刪除windc是合適的。

+0

重要 - 呼叫ReleaseDC爲以GetWindowDC相應的呼叫。 (在你的代碼中,你正在調用DeleteDC)。僅爲您自己創建的DC調用DeleteDC(例如,CreateCompatibleDC)。 – selbie

回答

1
DeleteDC(windc); 

從來沒有。您必須致電ReleaseDC(windc);代替。

之後::CreateCompatibleDC(windc);你不需要windc並不在意它會發生什麼。由CreateCompatibleDC返回的HDC只是派生出一些參數(與設備相關的像素表示等),但不以任何方式引用windc

取而代之的是:

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

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

/*DeleteDC(memdc) here? */ 

return bitmap; 

你必須做這樣的事情:

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

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

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

return bitmap; 
+0

所以我不需要刪除我自己創建的位圖? – biloon

+0

@biloon:「所以我不需要刪除自己創建的位圖?」當然,當你不再需要時,你必須刪除你的位圖。但是,如果你從函數中返回,你爲什麼要在這裏刪除它?當你完成位圖時,將其刪除,並且在此之後不要返回其句柄(該句柄不再有效)。 –

相關問題