假设我创build了一个在内存中处理位图并返回的函数
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是纯粹创build的(并且不包含“指向”windc的信息)? 如果这是真的,那么创build位图和memdc后(在任何绘画之前)删除windc是适当的。
DeleteDC(windc);
决不。 你必须打电话给ReleaseDC (windc); 代替。
After ::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;