微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

假设我创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是适当的。

检测Windows jpeg图标

Linux上的时区转换C API,任何人?

检索要通过networking发送的ID3D11Texture2D数据

epoll在断开客户端时循环

从perf获取用户空间堆栈信息

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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐