绘制时调用Draw_Axis_xyLebal(&me)造成内存每秒4K的增加-解决方法
绘制时调用Draw_Axis_xyLebal(&me)造成内存每秒4K的增加-
在调用Draw_Axis_xyLebal(&me)时在任务管理器中内存大概每秒4K的增加,注释掉这个函数就不会增加了,查看Draw_Axis_xyLebal(&me)之后也没发现那里资源泄露了,请各位大神看看那里出问题了。
------解决方案--------------------
------解决方案--------------------
主要是 “hFont=pdc->SelectObject(hOld);//删除之前应该先选出”
不选出 是 删除 不了的。
在调用Draw_Axis_xyLebal(&me)时在任务管理器中内存大概每秒4K的增加,注释掉这个函数就不会增加了,查看Draw_Axis_xyLebal(&me)之后也没发现那里资源泄露了,请各位大神看看那里出问题了。
//绘画横纵坐标的文本数,如默认为数据轴和时间轴
void CDataShow::OnPaint()
{
CPaintDC dc(this); // device context for painting
m_High=(m_dataRect.right-m_dataRect.left);
m_Low=0;
m_Top=(-m_dataRect.top+m_dataRect.bottom-2*h);
m_Bottom=0;
m_dNum=(m_High - m_Low)/10;
m_dnum_top_bottom=(m_Top - m_Bottom)/10;
//CDC *pDC;
//pDC=GetDC();
GetClientRect(m_frameRect);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, m_frameRect.Width(), m_frameRect.Height());//生成空间的内存位图
CDC me;
me.CreateCompatibleDC(NULL);//生成内存cd
me.SelectObject(&bitmap);
me.SetBkMode(TRANSPARENT);//设置透明字体
me.SetTextColor(RGB(255,0,0));
bitmap.DeleteObject();
////////////////////////添加绘图函数
Draw_Axis_xyLebal(&me); //////就是这一句,调用了就造成内存泄露
///////////////////////////////////////////////////////////////////////////
me.SetROP2(R2_WHITE);
dc.BitBlt(0, 0, m_frameRect.Width(), m_frameRect.Height(), &me, 0, 0, SRCCOPY);//拷备
bitmap.DeleteObject();
me.DeleteDC();
//pDC->DeleteDC();
// Do not call CStatic::OnPaint() for painting messages
}
void CDataShow::Draw_Axis_xyLebal(CDC *pdc)
{
SetDataRect();
CFont* pFont = pdc->GetCurrentFont();//CFont类封装了一个Windows图形设备接口(GDI)字体,并为操作字体提供了成员函数。
LOGFONT logFont ;//在Windows内部,字体是以一个名为LOGFONT的结构来表示
pFont->GetLogFont(&logFont);
logFont.lfEscapement = 900 ;//900/10 = 90 //lfEscapement:以十分之一度为单位指定每一行文本输出时相对于页面底端的角度。
HFONT hFont=CreateFontIndirect(&logFont); //该函数创建一种在指定结构定义其特性的逻辑字体
///////////////x轴文字输出/////// /
pdc->TextOut((m_dataRect.left+m_dataRect.right)/2-4*m_sAxis_xstr.GetLength(),m_pOrth.y+h+20,m_sAxis_xstr);
////////////////////y轴文字输出//////
pdc->SelectObject(hFont);
pdc->TextOut(m_pOrth.x+5,(m_dataRect.bottom+m_dataRect.top)/2.5+4*m_sAxis_ystr.GetLength(),m_sAxis_ystr);
DeleteObject(hFont);
pdc->SelectObject(pFont);
pFont->DeleteObject();
// delete hFont;
}
------解决方案--------------------
void CDataShow::Draw_Axis_xyLebal(CDC *pdc)
{
SetDataRect();
//CFont* pFont = pdc->GetCurrentFont();//CFont类封装了一个Windows图形设备接口(GDI)字体,并为操作字体提供了成员函数。
LOGFONT logFont ;//在Windows内部,字体是以一个名为LOGFONT的结构来表示
pFont->GetLogFont(&logFont);
logFont.lfEscapement = 900 ;//900/10 = 90 //lfEscapement:以十分之一度为单位指定每一行文本输出时相对于页面底端的角度。
HFONT hFont=CreateFontIndirect(&logFont); //该函数创建一种在指定结构定义其特性的逻辑字体
///////////////x轴文字输出/////// /
pdc->TextOut((m_dataRect.left+m_dataRect.right)/2-4*m_sAxis_xstr.GetLength(),m_pOrth.y+h+20,m_sAxis_xstr);
////////////////////y轴文字输出//////
HFONT hOld=pdc->SelectObject(hFont);
pdc->TextOut(m_pOrth.x+5,(m_dataRect.bottom+m_dataRect.top)/2.5+4*m_sAxis_ystr.GetLength(),m_sAxis_ystr);
hFont=pdc->SelectObject(hOld);//删除之前应该先选出
DeleteObject(hFont);
//pdc->SelectObject(pFont);
//pFont->DeleteObject();
// delete hFont;
}
------解决方案--------------------
主要是 “hFont=pdc->SelectObject(hOld);//删除之前应该先选出”
不选出 是 删除 不了的。