恳请高手进!!!!有关图像显示,重会时出现内存使用量不断变大
我的问题是这样的,我把位图存到Access中在从数据库中读出来,让好几张位图显示在视图中,视图是以CScrollView为基类的视图。功能是实现了但是问题出来了。当我托动视图的滚动条时,我每托动一次后查看任务管理器中的内存使用量,发现内存使用量在不断的变大。我想可能是视图窗口发生重会时内存使用量在不断的变大。请问怎样解决这个问题啊?
下面是我实现从数据库中取出位图再让位图显示在视图窗口上的代码,请大家看看问题出现在哪,是不是哪个资源用完后没关啊?请大家指点指点啊!
void CPrintView::OnDraw(CDC* pDC)
{
CPrintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int nPageNumber=pInfo->m_nCurPage;
ADO m_Ado;
m_Ado.OnInitADOConn();//连接数据库
CString SQL;
///////////////////////////////////////////////////////////////// 表示把相片插入到相应的学号的那行记录中
if (report.all)
{
SQL.Format("select * from xuyuanxinxibaobiao order by 学号 asc");
m_Ado.m_pRecordset = m_Ado.OpenRecordset(SQL);//打开记录集
}
else
{
SQL= "select * from xuyuanxinxibaobiao";
m_Ado.m_pRecordset = m_Ado.OpenRecordset(SQL);
CString str;
str.Format("%s = '%s'",report.strField, report.neirong);//设置查询字符串
m_Ado.m_pRecordset->Filter = (_bstr_t)str;//进行查询
m_Ado.m_pRecordset->Requery(0);//用查询结果更新当前记录集
}
int x=1;
while(!m_Ado.m_pRecordset->adoEOF)
{
for(int i=0;i<7;i++)
{
if(nPageNumber==x)
{
HBITMAP m_hBitmap;
//读取图像字段的实际大小
long lDataSize = m_Ado.m_pRecordset ->GetFields()->GetItem("照片")->ActualSize;
char *m_pBuffer; //定义缓冲变量
if(lDataSize > 0)
{
//从图像字段中读取数据到varBLOB中
_variant_t varBLOB;
varBLOB =m_Ado.m_pRecordset ->GetFields()->GetItem("照片")->GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))//指定varBLOB中因素的数据类型为无符号字符型
{
if(m_pBuffer = new char[lDataSize+1]) //分配必要的存储空间
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);//重新装载数据,得一个指针给pBuf
memcpy(m_pBuffer,pBuf,lDataSize); ///复制数据到缓冲区m_pBuffer
SafeArrayUnaccessData (varBLOB.parray);// 又把刚才装载的数据给解开了。
//将数据转换为HBITMAP格式
LPSTR hDIB;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader; //用于保存BMP文件头信息,包括类型、大小、位移量等
DWORD bmfHeaderLen; //保存文件头的长度
bmfHeaderLen = sizeof(bmfHeader); //读取文件头的长度
//将m_pBuffer中文件头复制到bmfHeader中
strncpy((LPSTR)&bmfHeader, (LPSTR)m_pBuffer, bmfHeaderLen);
if (bmfHeader.bfType != (*(WORD*)"BM")) //如果文件类型不对,则返回
{
MessageBox("BMP文件格式不准确");
return;
}
hDIB = m_pBuffer + bmfHeaderLen; //将指针移至文件头后面
//读取BMP文件的图像数据,包括坐标及颜色格式等信息到BITMAPINFOHEADER对象
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB;
//读取BMP文件的图像数据,包括坐标及颜色格式等信息到BITMAPINFO对象
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
//根据bfOffBits属性将指针移至文件头后
lpDIBBits = (m_pBuffer) + ((BITMAPFILEHEADER *)m_pBuffer)->bfOffBits;
CClientDC dc(this); //生成一个与当前窗口相关的CClientDC,用于管理输出设置
//生成DIBitmap数据
m_hBitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
}
}
}
if(m_hBitmap != NULL)
{
CDC memdc;
memdc.CreateCompatibleDC( pDC );// 创建一个设备上下文来记忆上面的设备上下文。也是与m_pictureshow相兼容的设备上下文
memdc.SelectObject(m_hBitmap);// 把设备上下文给m_hBitmap。也就是设备上下文中存储了m_hBitmap。
BITMAP bmp;
GetObject(m_hBitmap,sizeof(bmp),&bmp);//得到m_hBitmap的信息
pDC->StretchBlt((int)(37*rate.x),(int)((60+150*i)*rate.y),(int)(124*rate.x),(int)(119*rate.y),&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY); // 把源设备上下文的m_hBitmap复制到PCD里
memdc.DeleteDC();
}
m_Ado.m_pRecordset->MoveNext();
if ( !m_Ado.m_pRecordset->adoEOF )
{/*m_Ado.m_pRecordset->MoveNext();*/}//将记录集指针移动到下一条记录
else
{ m_Ado.CloseRecordset();
m_Ado.CloseConn();//断开数据库连接
return;
}
}
x++;
}
m_Ado.CloseRecordset();
m_Ado.CloseConn();//断开数据库连接