通常,如果程序将一个对象选择到设备上下文中,或者更改其属性,则应该在释放设备上下文之前将它们更改回来。如果不这样做会发生什么?
假设我这样做:
HDC hdc = GetDC(some_window);
SelectObject(hdc, some_font);
SetTextColor(hdc, 0x123456);
SetBkColor(hdc, 0xFEDCBA);
SetROP2(hdc, R2_XORPEN);
ReleaseDC(some_window, hdc);
and some_window
的窗口类没有CS_OWNDC
or CS_CLASSDC
旗帜。会发生什么?
在您列出的功能中,SelectObject
如果不取消选择对象(通过选择原始对象),这是唯一会导致问题的。这会导致some_font
资源会被泄漏,因为 DC 在释放该资源时一直持有该资源的打开句柄。
你应该这样做:
HDC hdc = GetDC(some_window);
HGDIOBJ hOldObj = SelectObject(hdc, some_font);
// ...
SelectObject(hdc, hOldObj);
ReleaseDC(some_window, hdc);
或者也许是这样的:
HDC hdc = GetDC(some_window);
int nSaved = SaveDC(hdc);
SelectObject(hdc, some_font);
// ...
RestoreDC(nSaved);
ReleaseDC(some_window, hdc);
As MSDN 注释 http://msdn.microsoft.com/en-us/library/windows/desktop/dd162753%28v=vs.85%29.aspx :
这些函数中的每一个都返回一个标识新对象的句柄。
应用程序检索句柄后,必须调用选择对象函数来替换默认对象。但是,应用程序应该保存标识默认对象的句柄并
当不再需要新对象时,使用此句柄替换它。
当应用程序完成使用新对象的绘制时,它必须
通过调用恢复默认对象选择对象功能
然后通过调用删除新对象删除对象功能。无法删除对象会导致严重的性能问题
问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)