+ -
当前位置:首页 → 问答吧 → 双缓存画图内存释放问题

双缓存画图内存释放问题

时间:2011-12-04

来源:互联网

各位高手:我为了使进度条显示文字和不同情况下的进度(不同颜色),使用双缓存画图,当需要更新进度条时,我使用RedrawWindow()函数调用进度条的OnPaint()函数,OnPaint()代码如下,现在我遇到两个问题:第一 我发现对话框起来以后,内存会以4K的速度不停的增长,我感觉能释放的都释放了,我把OnPaint()函数注释了就不存在着个问题。请高手指点。。第二 我后来单步跟进去发现,在OnPaint()中设断点,程序不停的调用OnPaint(),不知道为什么?难道mfc就是不停调用OnPaint()函数?很是不解?请指教......
void CTextProgressCtrl::OnPaint() 
{
 if (m_nMin >= m_nMax) 
  return;
 
 CRect LeftRect, RightRect, ClientRect,tempRect;
 CBitmap MemBitmap;

 GetClientRect(ClientRect);
 double Fraction = (double)(m_nPos - m_nMin) / ((double)(m_nMax - m_nMin));
 
 CPaintDC PaintDC(this); 
 MemDC.CreateCompatibleDC(&PaintDC);
 MemDC.GetClipBox(&tempRect);
 MemBitmap.CreateCompatibleBitmap(&MemDC,tempRect.Width,tempRect.Height); 
 CFont def_font ;
 CFont* old_font ;
 def_font.CreateFont(
  12, // nHeight
  0, // 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
  "Arial"));  
 old_font =MEMdc.SelectObject(&def_font);
 LeftRect = RightRect = ClientRect;
 
 LeftRect.right = LeftRect.left + (int)((LeftRect.right - LeftRect.left)*Fraction);
 MEMdc.FillSolidRect(LeftRect, m_colFore);
  
 RightRect.left = LeftRect.right
 MEMdc.FillSolidRect(RightRect, m_colBk);
 
 if (!m_bShowText)//m_bShowText是进度条要显示的文本
 {
  MEMdc.SelectObject(old_font);
  def_font.DeleteObject();
  return;
 }
  MEMdc.SetBkMode(TRANSPARENT);
 
  CRgn rgn,rgn1;
  rgn.CreateRectRgn(LeftRect.left, LeftRect.top, LeftRect.right, LeftRect.bottom);
  MEMdc.SelectClipRgn(&rgn);
  MEMdc.SetTextColor(m_colTextBk);
  MEMdc.DrawText(m_strText, ClientRect, DT_CENTER | DT_VCENTER | DT_WORDBREAK);
  MEMdc.SelectClipRgn(NULL);
  rgn.DeleteObject();

  rgn1.CreateRectRgn(RightRect.left, RightRect.top, RightRect.right, RightRect.bottom);
  MEMdc.SelectClipRgn(&rgn1);
  MEMdc.SetTextColor(m_colTextFore);
  MEMdc.DrawText(m_strText, ClientRect, DT_CENTER | DT_VCENTER | DT_WORDBREAK);
  MEMdc.SelectClipRgn(NULL);
  rgn1.DeleteObject();
  

  MEMdc.SelectObject(old_font);
  def_font.DeleteObject();

  CPen pen;
  CPen *oldpen;
  pen.CreatePen(20,1,RGB(0,40,200));
  oldpen=MEMdc.SelectObject(&pen);  
  MEMdc.MoveTo(RightRect.left,RightRect.top);
  MEMdc.LineTo(RightRect.right-1,RightRect.top);
  MEMdc.LineTo(RightRect.right-1,RightRect.bottom-1);  
  MEMdc.LineTo(RightRect.left,RightRect.bottom-1);
  MEMdc.LineTo(RightRect.left,RightRect.top);
  MEMdc.SelectObject(oldpen);
  pen.DeleteObject();
  MemBitmap.DeleteObject();
  MEMdc.deleteDC();
}

作者: nds_gaowen   发布时间: 2011-12-04

"我后来单步跟进去发现,在OnPaint()中设断点,程序不停的调用OnPaint(),",因为单步时窗口不断被debug破坏,所以系统不停的调用OnPaint。
Paint中的调试要用‘afxDump << "HAHA\n"’或者SDK中使用‘OutputDebugString("haha\n")’

作者: schlafenhamster   发布时间: 2011-12-04

谢谢1楼,可是还是没有解决内存释放问题,为什么我的运行时对话框也出现了,我没有操作任何东西,程序的内存还是不停的增长,这是为什么呀,请各位帮帮忙呀 ,等。。。。

作者: nds_gaowen   发布时间: 2011-12-04

把OnPaint()中的分段注释掉(简化问题)再看看

作者: schlafenhamster   发布时间: 2011-12-04

引用 3 楼 schlafenhamster 的回复:
把OnPaint()中的分段注释掉(简化问题)再看看


只能一步一步排查了

作者: heksn   发布时间: 2011-12-04

热门下载

更多