(Windows)何时删除对象和设备上下文
(Windows) When to delete object and device context?
假设我创建了一个函数来处理内存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;
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 我的一些 D3D11 对象在调用某些设备上下文函数时将自身作为 ComPtrs 为空
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- 线程上下文上的静态存储对象优化
- C++:如何创建一个临时对象,包含一个指针 - 常量或非常量,具体取决于上下文
- C++ V8 对象上下文
- 在未加载上下文的情况下在对象构造函数中使用OpenGL函数
- CORBA omniORB在解析名称上下文后无法获取远程对象
- 使用设备上下文在CImage对象上绘制线
- 从 std::function 获取对象上下文
- C++类方法,可以使用虚拟调度或类似于没有对象上下文的静态函数来调用
- 从gdiplus (GDI+)中的设备上下文或图形对象中获取图像/位图
- (Windows)何时删除对象和设备上下文
- QML 报告引用错误:XYZ 未在添加到上下文C++对象上定义