一段自绘按钮的代码,为什么会有内存泄露?该怎么处理
一段自绘按钮的代码,为什么会有内存泄露?
每运行一次,内存就会增长12到16字节,请问错在哪儿?
代码:
void CShadowCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC * dc = GetDC() ;
dcMemory.CreateCompatibleDC(dc);
CRect rc;
GetClientRect(&rc);
CBitmap bmp;
bmp.CreateCompatibleBitmap(dc,rc.Width(),rc.Height());
dcMemory.SelectObject(&bmp);
CBrush brush,*oldBrush;
CPen pen,*oldPen;
//draw BK
brush.Detach();
brush.CreateSolidBrush(m_bkColor);
pen.Detach();
pen.CreatePen(PS_SOLID,1,m_bkColor);
oldBrush = dcMemory.SelectObject(&brush);
oldPen = dcMemory.SelectObject(&pen);
dcMemory.Rectangle(&rc);
//Draw Text
dcMemory.SelectObject(&m_textFont);
CString strText;
GetWindowText(strText);
dcMemory.SetTextColor(m_textCurrColor);
dcMemory.SetBkMode(TRANSPARENT);
dcMemory.DrawText(strText,&rc,DT_CENTER | DT_VCENTER |DT_WORDBREAK);
dc-> BitBlt(0,0,rc.Width(),rc.Height(),&dcMemory,0,0,SRCCOPY);
dcMemory.SelectObject(oldBrush);
dcMemory.SelectObject(oldPen);
brush.DeleteObject();
pen.DeleteObject();
bmp.DeleteTempMap();
bmp.DeleteObject();
dcMemory.DeleteDC();
}
------解决方案--------------------
你用了
CDC * dc = GetDC() ;
你应该加上
ReleaseDC(dc);
你再试试吧,看有没有效果。
------解决方案--------------------
内存泄露怎么回事我不知道
不过我重载这个函数时rcItem ,hwnd....都是通过lpDrawItemStruct得到的
每运行一次,内存就会增长12到16字节,请问错在哪儿?
代码:
void CShadowCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC * dc = GetDC() ;
dcMemory.CreateCompatibleDC(dc);
CRect rc;
GetClientRect(&rc);
CBitmap bmp;
bmp.CreateCompatibleBitmap(dc,rc.Width(),rc.Height());
dcMemory.SelectObject(&bmp);
CBrush brush,*oldBrush;
CPen pen,*oldPen;
//draw BK
brush.Detach();
brush.CreateSolidBrush(m_bkColor);
pen.Detach();
pen.CreatePen(PS_SOLID,1,m_bkColor);
oldBrush = dcMemory.SelectObject(&brush);
oldPen = dcMemory.SelectObject(&pen);
dcMemory.Rectangle(&rc);
//Draw Text
dcMemory.SelectObject(&m_textFont);
CString strText;
GetWindowText(strText);
dcMemory.SetTextColor(m_textCurrColor);
dcMemory.SetBkMode(TRANSPARENT);
dcMemory.DrawText(strText,&rc,DT_CENTER | DT_VCENTER |DT_WORDBREAK);
dc-> BitBlt(0,0,rc.Width(),rc.Height(),&dcMemory,0,0,SRCCOPY);
dcMemory.SelectObject(oldBrush);
dcMemory.SelectObject(oldPen);
brush.DeleteObject();
pen.DeleteObject();
bmp.DeleteTempMap();
bmp.DeleteObject();
dcMemory.DeleteDC();
}
------解决方案--------------------
你用了
CDC * dc = GetDC() ;
你应该加上
ReleaseDC(dc);
你再试试吧,看有没有效果。
------解决方案--------------------
内存泄露怎么回事我不知道
不过我重载这个函数时rcItem ,hwnd....都是通过lpDrawItemStruct得到的