有关字体创建后,清除字体对象的问题。

sad_4978 2006-07-13 09:13:45
用CFont m_Font,定义个字体对象,然后创建字体。
LOGFONT lf;
lf.lfHeight= fontSize;
lf.lfWidth=0;
lf.lfEscapement=0;
lf.lfOrientation=0;
lf.lfWeight=bBold == TRUE ? 700 : FW_THIN;
lf.lfItalic=0;
lf.lfUnderline=bUnderLine;
lf.lfStrikeOut=0;
lf.lfCharSet=DEFAULT_CHARSET;
lf.lfOutPrecision=OUT_DEFAULT_PRECIS;
lf.lfClipPrecision=CLIP_DEFAULT_PRECIS;
lf.lfQuality=PROOF_QUALITY;
lf.lfPitchAndFamily=VARIABLE_PITCH;
lstrcpyn(lf.lfFaceName, lfFaceName, LF_FACESIZE);
m_Font.CreateFontIndirect(&lf);
以前,这样创建后就不管了。昨天见到一种写法,在析构函数中做释放操作。代码如下:
if(NULL != m_Font.m_hObject)
{
m_Font.DeleteObject();
}

我感觉这样做,没有必要,因为m_Font又不是指针,当类对象销毁时,m_Font也一起销毁。但有比较迷惑,既然有这样的做法也应该有一定的道理。请大家说说看法,给一个正确的解释,谢谢。
...全文
290 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
alene_cn 2006-07-14
  • 打赏
  • 举报
回复
注意CGdiObject的析构函数:

_AFXWIN_INLINE CGdiObject::~CGdiObject()
{ DeleteObject(); }

所有继承CGdiObject的类,CPen、CBrush、CFont等都不用再DeleteObject。
alene_cn 2006-07-14
  • 打赏
  • 举报
回复
CGdiObject* PASCAL CGdiObject::FromHandle(HGDIOBJ h)
{
CHandleMap* pMap = afxMapHGDIOBJ(TRUE); //create map if not exist
ASSERT(pMap != NULL);
CGdiObject* pObject = (CGdiObject*)pMap->FromHandle(h);
ASSERT(pObject == NULL || pObject->m_hObject == h);
return pObject;
}

BOOL CGdiObject::Attach(HGDIOBJ hObject)
{
ASSERT(m_hObject == NULL); // only attach once, detach on destroy
if (hObject == NULL)
return FALSE;
CHandleMap* pMap = afxMapHGDIOBJ(TRUE); // create map if not exist
ASSERT(pMap != NULL);
pMap->SetPermanent(m_hObject = hObject, this);
return TRUE;
}

HGDIOBJ CGdiObject::Detach()
{
HGDIOBJ hObject = m_hObject;
if (hObject != NULL)
{
CHandleMap* pMap = afxMapHGDIOBJ(); // don't create if not exist
if (pMap != NULL)
pMap->RemoveHandle(m_hObject);
}

m_hObject = NULL;
return hObject;
}

BOOL CGdiObject::DeleteObject()
{
if (m_hObject == NULL)
return FALSE;
return ::DeleteObject(Detach());
}
alene_cn 2006-07-14
  • 打赏
  • 举报
回复
VC6的MFC源代码,CFont和它的父类CGdiObject:

class CFont : public CGdiObject
{
DECLARE_DYNAMIC(CFont)

public:
static CFont* PASCAL FromHandle(HFONT hFont);

// Constructors
CFont();
BOOL CreateFontIndirect(const LOGFONT* lpLogFont);
BOOL CreateFont(int nHeight, int nWidth, int nEscapement,
int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline,
BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision,
BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily,
LPCTSTR lpszFacename);
BOOL CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL);
BOOL CreatePointFontIndirect(const LOGFONT* lpLogFont, CDC* pDC = NULL);

// Attributes
operator HFONT() const;
int GetLogFont(LOGFONT* pLogFont);

// Implementation
public:
virtual ~CFont();
#ifdef _DEBUG
virtual void Dump(CDumpContext& dc) const;
#endif
};

// CFont
_AFXWIN_INLINE CFont::operator HFONT() const
{ return (HFONT)(this == NULL ? NULL : m_hObject); }
_AFXWIN_INLINE CFont* PASCAL CFont::FromHandle(HFONT hFont)
{ return (CFont*) CGdiObject::FromHandle(hFont); }
_AFXWIN_INLINE CFont::CFont()
{ }
_AFXWIN_INLINE CFont::~CFont()
{ }
_AFXWIN_INLINE BOOL CFont::CreateFontIndirect(const LOGFONT* lpLogFont)
{ return Attach(::CreateFontIndirect(lpLogFont)); }
_AFXWIN_INLINE BOOL CFont::CreateFont(int nHeight, int nWidth, int nEscapement,
int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline,
BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision,
BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily,
LPCTSTR lpszFacename)
{ return Attach(::CreateFont(nHeight, nWidth, nEscapement,
nOrientation, nWeight, bItalic, bUnderline, cStrikeOut,
nCharSet, nOutPrecision, nClipPrecision, nQuality,
nPitchAndFamily, lpszFacename)); }
_AFXWIN_INLINE int CFont::GetLogFont(LOGFONT* pLogFont)
{ ASSERT(m_hObject != NULL);
return ::GetObject(m_hObject, sizeof(LOGFONT), pLogFont); }


class CGdiObject : public CObject
{
DECLARE_DYNCREATE(CGdiObject)
public:

// Attributes
HGDIOBJ m_hObject; // must be first data member
operator HGDIOBJ() const;
HGDIOBJ GetSafeHandle() const;

static CGdiObject* PASCAL FromHandle(HGDIOBJ hObject);
static void PASCAL DeleteTempMap();
BOOL Attach(HGDIOBJ hObject);
HGDIOBJ Detach();

// Constructors
CGdiObject(); // must Create a derived class object
BOOL DeleteObject();

// Operations
int GetObject(int nCount, LPVOID lpObject) const;
UINT GetObjectType() const;
BOOL CreateStockObject(int nIndex);
BOOL UnrealizeObject();
BOOL operator==(const CGdiObject& obj) const;
BOOL operator!=(const CGdiObject& obj) const;

// Implementation
public:
virtual ~CGdiObject();
#ifdef _DEBUG
virtual void Dump(CDumpContext& dc) const;
virtual void AssertValid() const;
#endif
};

// CGdiObject
_AFXWIN_INLINE CGdiObject::operator HGDIOBJ() const
{ return this == NULL ? NULL : m_hObject; }
_AFXWIN_INLINE HGDIOBJ CGdiObject::GetSafeHandle() const
{ return this == NULL ? NULL : m_hObject; }
_AFXWIN_INLINE CGdiObject::CGdiObject()
{ m_hObject = NULL; }
_AFXWIN_INLINE CGdiObject::~CGdiObject()
{ DeleteObject(); }
_AFXWIN_INLINE int CGdiObject::GetObject(int nCount, LPVOID lpObject) const
{ ASSERT(m_hObject != NULL); return ::GetObject(m_hObject, nCount, lpObject); }
_AFXWIN_INLINE BOOL CGdiObject::CreateStockObject(int nIndex)
{ return (m_hObject = ::GetStockObject(nIndex)) != NULL; }
_AFXWIN_INLINE BOOL CGdiObject::UnrealizeObject()
{ ASSERT(m_hObject != NULL); return ::UnrealizeObject(m_hObject); }
_AFXWIN_INLINE UINT CGdiObject::GetObjectType() const
{ return (UINT)::GetObjectType(m_hObject); }
_AFXWIN_INLINE BOOL CGdiObject::operator==(const CGdiObject& obj) const
{ return ((HGDIOBJ) obj) == m_hObject; }
_AFXWIN_INLINE BOOL CGdiObject::operator!=(const CGdiObject& obj) const
{ return ((HGDIOBJ) obj) != m_hObject; }
sad_4978 2006-07-14
  • 打赏
  • 举报
回复
再顶。
wanilyer 2006-07-13
  • 打赏
  • 举报
回复
期待。。。 帮你顶
sad_4978 2006-07-13
  • 打赏
  • 举报
回复
顶一下,看看有没有其他的解释。
madmanahong 2006-07-13
  • 打赏
  • 举报
回复
仅仅是C语言爱好者的习惯,

C++具有析购,所以不用理会!
sad_4978 2006-07-13
  • 打赏
  • 举报
回复
再顶。
sad_4978 2006-07-13
  • 打赏
  • 举报
回复
怎么没有人回答阿。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧