2011-06-21 15 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:“所以我不需要删除自己创建的位图?”当然,当你不再需要时,你必须删除你的位图。但是,如果你从函数中返回,你为什么要在这里删除它?当你完成位图时,将其删除,并且在此之后不要返回其句柄(该句柄不再有效)。 –

相关问题