CDC使用方法//什么叫作临时使用,用完不用删除

CDC使用方法//什么叫做临时使用,用完不用删除?


临时使用,用完不用删除

CDC *pDC = CDC::FromHandle(hDC); //MFC不保证什么时候删除DC

CBitmap *pBmp = CBitmap::FromHandle(hBitmap)


1.2 永久使用,用完需要删除GDI对象一定要释放内存并删除对象

   CDC dc;

   dc.Attach(hDC);  //窗口绑定,永久的,一直到你删除它

   //..........//   

   dc.Detach(hDC);  //当不用的时候要销毁


------最佳解决方案--------------------
 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;
}
// remember early to avoid leak
m_hObject = hObject;
CHandleMap* pMap = afxMapHGDIOBJ(TRUE); // create map if not exist
ASSERT(pMap != NULL);
pMap->SetPermanent(m_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;
}


全局变量pMap是源头,在一般情况下没有任何问题,如果多线程的情况就难说了.
为了万无一失,MS将它定义为临时变量,你把它存起来也没有大问题.只有::Detach()能够使它失效.
------其他解决方案--------------------
不是new出来的,不用删
------其他解决方案--------------------
这里的Attach,Detach也只是一个引用计数的概念,并不是删除
------其他解决方案--------------------
前面不销毁是因为hdc转化为指针使用。
hdc和hBitmap都是操作使用。

后面dc是实体DeleteDC来释放。
attach只是附着方式,
------其他解决方案--------------------
CBitmap *pBmp = CBitmap::FromHandle(hBitmap)
之后如果有人::Detach(hBitmap)你的pBmp就失效了,因为这个pBmp的生命周期由mfc管理

{
CHandleMap* pMap = afxMapHGDIOBJ(TRUE); //create map if not exist
ASSERT(pMap != NULL);
CGdiObject* pObject = (CGdiObject*)pMap->FromHandle(h);
ASSERT(pObject == NULL 
------其他解决方案--------------------
漏了一行


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;
}
// remember early to avoid leak
m_hObject = hObject;
CHandleMap* pMap = afxMapHGDIOBJ(TRUE); // create map if not exist