如何解决我需要对从 SystemParametersInfo() 检索到的字体调用 DeleteObject() 吗?
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(NONCLIENTMETRICS);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(NONCLIENTMETRICS),&ncm,0);
HFONT hFont = CreateFontIndirect(&ncm.lfMessageFont);
然后
更改控件的字体如下:
SendMessage(hwnd,WM_SETFONT,(WParaM) hFont,TRUE);
我的问题是,既然这个字体是由 SystemParametersInfo()
检索到的,我是否需要用 DeleteObject()
删除它?我不确定操作系统拥有该内存,因此我不需要释放它。
解决方法
SystemParametersInfo
返回 LOGFONT
结构。这些结构不需要释放。
创建字体(从 LOGFONT
或其他)让您负责资源清理。此处的字体对象不是由 SystemParametersInfo
创建的,而是由对 CreateFontIndirect
的调用创建的。
正如其他人所说,您不需要在 DeleteObject()
结构上调用 LOGFONT
。
但是,您需要对从 DeleteObject()
返回的 HFONT
调用 CreateFontIndirect()
。
但是一个更大的问题是,...您需要等待在 DeleteObject()
上调用 HFONT
,直到您销毁您将字体设置为使用 {{1} 的窗口(和任何其他窗口) }}。
伪代码:
- 获取您的
WM_SETFONT
... - 致电
NONCLIENTMETRICS
- 致电
hFont = CreateFontIndirect()
- 等待窗口被销毁(或应用程序清理)
- 在
SendMessage(WM_SETFONT)
上拨打DeleteObject()
如果您打算将 hFont
用于多个窗口,请创建一次,然后等到应用程序关闭以将其清理(或者,等到您知道使用它的所有窗口都具有被摧毁)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。