首页 > 解决方案 > CFont::FromHandle(HFONT) 是否承担 HFONT 的所有权?

问题描述

CFont::FromHandle(HFONT)返回一个CFont*包装HFONT. MFC 文档指出:

如果CFont对象尚未附加到句柄,CFont则创建并附加一个临时对象。此临时CFont对象仅在应用程序在其事件循环中具有空闲时间之前有效,此时所有临时图形对象都将被删除。另一种说法是临时对象仅在处理一个窗口消息期间有效。

但它没有说明临时CFont对象是否会DeleteObject()HFONT删除时调用。

是否CFont::FromHandle(HFONT)承担HFONT?

如果是这样,如果它HFONT已经被不同的CFont实例包装了会发生什么?


在上下文中:我正在使用具有“字体管理器”对象的遗留代码,我要求适当的字体。我知道字体管理器在内部将字体存储为CFont实例,但它的方法只是将它们作为HFONT.

所以我有这样的代码:

{
  CDC* pDC = GetDC();
  HFONT fontH = myFontManager->GetTheRightFont(state);
  CFont* newFont = CFont::FromHandle(fontH);
  CFont* oldFont = pDC->SelectObject(newFont);
  ..
  // draw some stuff
  ..
  pDC->SelectObject(oldFont);
  ReleaseDC(pDC);
}

我担心的是,当临时newFont对象被删除时,它可能会调用DeleteObject()一个fontH包含不再有效的字体句柄myFontManager的成员实例。CFont

注意:我已阅读https://www.codeproject.com/Articles/535/Attaching-and-Detaching-Objects但我不清楚这如何适用于FromHandle.

标签: windowswinapivisual-c++mfc

解决方案


推荐阅读