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

时间:2011-06-21 06:33:55

标签: c++ windows winapi native

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

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

1 个答案:

答案 0 :(得分: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;