前不久自绘了button,edit控件,发现GDI资源泄漏比较厉害

最近自绘了button,edit控件,发现GDI资源泄漏比较厉害
如上题,比如一个按钮点击一下,gdi数量就增10左右,这完全不正常。先说button部分,edit打算另开一贴。


void CUIButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)中函数部分

HICON hicon = (HICON)LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(m_Iconid), IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR);
ICONINFO iconinfo;
GetIconInfo(hicon, &iconinfo);
HBITMAP hBitmap = iconinfo.hbmMask;
BITMAP bmp;
GetObject(hBitmap, sizeof(bmp), &bmp);
int xpos, ypos;
xpos = rect.right - bmp.bmHeight - ioffset;
ypos = (rect.Height() - bmp.bmHeight) / 2;
DrawIconEx(pDC->m_hDC, xpos, ypos, hicon, bmp.bmWidth, bmp.bmHeight, 0, NULL, DI_NORMAL);


通过慢慢注释定位,感觉就是那个LoadImage有问题,那个hicon句柄我也DeleteObject掉了,不明白为什么?

------解决思路----------------------
这个是基础吧,MSDN 上说过的:
http://msdn.microsoft.com/en-us/library/ms648045.aspx
Bitmap DeleteObject
Cursor DestroyCursor
Icon   DestroyIcon
各种资源的释放方式。
------解决思路----------------------
前不久自绘了button,edit控件,发现GDI资源泄漏比较厉害
恭喜~
------解决思路----------------------
向LZ学习学习
------解决思路----------------------
VS2010的离线msdn上也没有win32 api的函数
------解决思路----------------------

_AFXWIN_INLINE CGdiObject::~CGdiObject()
{
    AFX_BEGIN_DESTRUCTOR

        DeleteObject(); 

    AFX_END_DESTRUCTOR
}
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());
}
//

class CBitmap : public CGdiObject

//
_AFXWIN_INLINE BOOL CBitmap::LoadBitmap(LPCTSTR lpszResourceName)
{ return Attach(::LoadBitmap(AfxFindResourceHandle(
lpszResourceName, RT_BITMAP), lpszResourceName));}


如果用的是MFC,那建议用GDI/MFC版本 ,位图加载用CBitmap ;
如果用WIN32,那么就自己处理释放问题!