(Windows)何时删除对象和设备上下文

(Windows) When to delete object and device context?

本文关键字:上下文 对象 删除 Windows 何时      更新时间:2023-10-16

假设我创建了一个函数来处理内存dc中的位图并将其返回

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是合适的。

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;