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

我需要对从 SystemParametersInfo() 检索到的字体调用 DeleteObject() 吗?

如何解决我需要对从 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} 的窗口(和任何其他窗口) }}。

伪代码:

  1. 获取您的WM_SETFONT...
  2. 致电NONCLIENTMETRICS
  3. 致电hFont = CreateFontIndirect()
  4. 等待窗口被销毁(或应用程序清理)
  5. SendMessage(WM_SETFONT)上拨打DeleteObject()

如果您打算将 hFont 用于多个窗口,请创建一次,然后等到应用程序关闭以将其清理(或者,等到您知道使用它的所有窗口都具有被摧毁)。

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