双缓存画图内存释放问题
时间: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();
}
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")’
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()中的分段注释掉(简化问题)再看看
把OnPaint()中的分段注释掉(简化问题)再看看
只能一步一步排查了
作者: heksn 发布时间: 2011-12-04
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28