我在 EVC 上用CDC 画图出现 了很严重的内存泄漏,每刷新一次泄漏4K的内存。
希望高手能帮我解决一下呀。 要是在深圳的话,我请你去深圳威尼斯国际大酒店吃 200 块一份的自助餐。
QQ 12086733 ,要原码的话加我。
void CChildView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
if(m_bIsInitialDBB == false)//如果是第一次,则初始化双缓冲相关的要素
{
InitialDBB();
m_bIsInitialDBB = true;
PaintDBB(true); //双缓冲画图
}
else
{
PaintDBB(true); //双缓冲画图
}
// Do not call CWnd::OnPaint() for painting messages
}
// 初始化和双缓冲相关的要素
void CChildView::InitialDBB()
{
CRect rt;
this->GetClientRect(&rt);
//建立与屏幕显示兼容的内存显示设备
if(!MemDC.CreateCompatibleDC(NULL))
{
::PostQuitMessage(0);
}
CDC *pdcView = this->GetDC();
//这时还不能绘图,因为没有地方画,下面建立一个与屏幕显示兼容的位图
MemBitmap.CreateCompatibleBitmap(pdcView,rt.Width(),rt.Height());
//将位图选入到内存显示设备中,只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
this->ReleaseDC(pdcView);// 释放view的设备环境
}
//双缓冲画图
void CChildView::PaintDBB(bool p_ballDraw)
{
CDC *pdcView = this->GetDC();
CMemLeakApp *myApp = (CMemLeakApp *)::AfxGetApp();
CRect rt;
this->GetClientRect(&rt);
//先用背景色将位图清除干净
MemDC.FillSolidRect(0,0,rt.Width(),rt.Height(),RGB(255,255,255));
if(false)
{
DrawButton(&MemDC,CRect(50,50,150,150) ,false,_T("test"),_T("aa"));
}
else
{
DrawButton(&MemDC,CRect(50,50,150,150) ,p_ballDraw,_T("test"),_T("aa"));
//将内存中的图拷贝到屏幕上进行显示
pdcView->BitBlt(0,0,rt.Width(),rt.Height(),&MemDC,0,0,SRCCOPY);
}
//绘图完成后的清理
this->ReleaseDC(pdcView);
}
下在的这个函数是画按扭的。
void CChildView::DrawButton(CDC* pDC,CRect rect,bool bState,LPCTSTR szText1,LPCTSTR szText2)
{
COLORREF clBtnFace = RGB(192,192,192);
// COLORREF clBtnFace = RGB(18,100,179);
COLORREF clHighlight,clShadow,crBorder;
clHighlight = clBtnFace;
clShadow = clBtnFace;
crBorder = RGB(0,0,0);
//
CBrush* pOldBrush;
CBrush brush(clBtnFace);
pOldBrush = pDC->SelectObject(&brush);
//画按钮表面
CRect rcFace(rect);
rcFace.DeflateRect(15,15);
pDC->FillRect(&rcFace,&brush);
//画阴影部分
int byRed,byGreen,byBlue;
for(int i=0;i<15;i++)
{
//左上
byRed = GetRValue(clHighlight);
byRed+=3;
if(byRed>255)
byRed = 255;
byGreen = GetGValue(clHighlight);
byGreen+=3;
if(byGreen>255)
byGreen = 255;
byBlue = GetBValue(clHighlight);
byBlue+=3;
if(byBlue>255)
byBlue = 255;
clHighlight = RGB(byRed,byGreen,byBlue);
CPen pen(PS_SOLID,1,clHighlight);
pDC->SelectObject(&pen);
if(bState)
{
pDC->MoveTo(rcFace.right,rcFace.top);
pDC->LineTo(rcFace.right,rcFace.bottom);
pDC->MoveTo(rcFace.left,rcFace.bottom);
pDC->LineTo(rcFace.right+1,rcFace.bottom);
}
else
{
pDC->MoveTo(rcFace.left,rcFace.top);
pDC->LineTo(rcFace.right,rcFace.top);
pDC->MoveTo(rcFace.left,rcFace.top);
pDC->LineTo(rcFace.left,rcFace.bottom);
}
//右下
byRed = GetRValue(clShadow);
byRed-=3;
if(byRed<0)
byRed = 0;
byGreen = GetGValue(clShadow);
byGreen-=3;
if(byGreen<0)
byGreen = 0;
byBlue = GetBValue(clShadow);
byBlue-=3;
if(byBlue<0)
byBlue = 0;
clShadow = RGB(byRed,byGreen,byBlue);
CPen pen1(PS_SOLID,1,clShadow);
pDC->SelectObject(&pen1);
if(bState)
{
pDC->MoveTo(rcFace.left,rcFace.top);
pDC->LineTo(rcFace.right,rcFace.top);
pDC->MoveTo(rcFace.left,rcFace.top);
pDC->LineTo(rcFace.left,rcFace.bottom);
}
else
{
pDC->MoveTo(rcFace.right,rcFace.top);
pDC->LineTo(rcFace.right,rcFace.bottom);
pDC->MoveTo(rcFace.left,rcFace.bottom);
pDC->LineTo(rcFace.right+1,rcFace.bottom);
}
rcFace.InflateRect(1,1);
}
//画文字
CFont font,*pf;
VERIFY(font.CreateFont(
25, // nHeight
12, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("Arial")));
pf = (CFont*)pDC->SelectObject(&font);
//
UINT nBkMode = pDC->SetBkMode(TRANSPARENT);
//
pDC->SetTextColor(RGB(240,240,240));
//
CSize sz1,sz2;
if(szText1)
sz1 = pDC->GetTextExtent(szText1,_tcslen(szText1));
if(szText2)
sz2 = pDC->GetTextExtent(szText2,_tcslen(szText2));
CRect rcText;
rcFace.DeflateRect(15,15);
if(szText1!=NULL&&szText2!=NULL)//两个都有
{
if(bState)//按下
{
rcText.left = rcFace.left+(rcFace.Width()-sz1.cx)/2+2;
rcText.top = rcFace.top+(rcFace.Height()-sz1.cy-sz2.cy)/2+2;
rcText.right = rcText.left+sz1.cx+2;
rcText.bottom = rcText.top+sz1.cy+2;
pDC->DrawText(szText1,_tcslen(szText1),&rcText,DT_LEFT);
rcText.left = rcFace.left+(rcFace.Width()-sz2.cx)/2+2;
rcText.top = rcText.top+sz1.cy;
rcText.right = rcText.left+sz2.cx+2;
rcText.bottom = rcText.bottom+sz1.cy;
pDC->DrawText(szText2,_tcslen(szText2),&rcText,DT_LEFT);
}
else
{
rcText.left = rcFace.left+(rcFace.Width()-sz1.cx)/2;
rcText.top = rcFace.top+(rcFace.Height()-sz1.cy-sz2.cy)/2;
rcText.right = rcText.left+sz1.cx;
rcText.bottom = rcText.top+sz1.cy;
pDC->DrawText(szText1,_tcslen(szText1),&rcText,DT_LEFT);
rcText.left = rcFace.left+(rcFace.Width()-sz2.cx)/2;
rcText.top += sz1.cy;
rcText.right = rcText.left+sz2.cx;
rcText.bottom += sz1.cy;
pDC->DrawText(szText2,_tcslen(szText2),&rcText,DT_LEFT);
}
}
else if(szText1==NULL&&szText2==NULL)//两个都没有
{
}
else//只有一个有
{
if(bState)//按下
{
if(szText1)
{
rcText.left = rcFace.left+(rcFace.Width()-sz1.cx)/2+2;
rcText.top = rcFace.top+(rcFace.Height()-sz1.cy)/2+2;
rcText.right = rcText.left+sz1.cx+2;
rcText.bottom = rcText.top+sz1.cy+2;
pDC->DrawText(szText1,_tcslen(szText1),&rcText,DT_LEFT);
}
if(szText2)
{
rcText.left = rcFace.left+(rcFace.Width()-sz2.cx)/2+2;
rcText.top = rcFace.top+(rcFace.Height()-sz2.cy)/2+2;
rcText.right = rcText.left+sz2.cx+2;
rcText.bottom = rcText.top+sz2.cy+2;
pDC->DrawText(szText2,_tcslen(szText2),&rcText,DT_LEFT);
}
}
else
{
if(szText1)
{
rcText.left = rcFace.left+(rcFace.Width()-sz1.cx)/2;
rcText.top = rcFace.top+(rcFace.Height()-sz1.cy)/2;
rcText.right = rcText.left+sz1.cx;
rcText.bottom = rcText.top+sz1.cy;
pDC->DrawText(szText1,_tcslen(szText1),&rcText,DT_LEFT);
}
if(szText2)
{
rcText.left = rcFace.left+(rcFace.Width()-sz2.cx)/2;
rcText.top = rcFace.top+(rcFace.Height()-sz2.cy)/2;
rcText.right = rcText.left+sz2.cx;
rcText.bottom = rcText.top+sz2.cy;
pDC->DrawText(szText2,_tcslen(szText2),&rcText,DT_LEFT);
}
}
}
pDC->SetBkMode(nBkMode);
pDC->SelectObject(pf);
pDC->SelectObject(pOldBrush);
}
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
PaintDBB(false);
// AfxMessageBox(_T("Down"));
CWnd ::OnLButtonDown(nFlags, point);
}
void CChildView::OnLButtonUp(UINT nFlags, CPoint point)
{
PaintDBB(true);
CWnd ::OnLButtonUp(nFlags, point);
}