首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

使用CreateDIBSection,重复打开多次8兆BMP图片后出现内存不足,请帮忙检查下代码有关问题

2012-02-13 
使用CreateDIBSection,重复打开多次8兆BMP图片后出现内存不足,请帮忙检查下代码问题?CDib::CDib(){m_pBits

使用CreateDIBSection,重复打开多次8兆BMP图片后出现内存不足,请帮忙检查下代码问题?
CDib::CDib()
{
  m_pBits = NULL;
  m_lpBMI = NULL;
  m_pPalette = NULL;
  MemDC=NULL;
  hOldbmp=NULL;
  hBitmap=NULL;
}
CDib::~CDib()
{
  Free();
}
void CDib::Free()
{
if(hOldbmp)
{
SelectObject(MemDC,hOldbmp);
}
if (hBitmap)
{
DeleteObject(hBitmap) ;
hBitmap=NULL;
}
if (MemDC)
{
DeleteDC(MemDC) ;
MemDC=NULL;
}
if (m_lpBMI)
{
delete[] m_lpBMI;
m_lpBMI = NULL;
}
if (m_pPalette)
{
m_pPalette->DeleteObject();
delete m_pPalette;
m_pPalette = NULL;
}

}
DWORD CDib::CreateDib1bits(int aWidth,int aHeight)//创建一个DIB文件
{
DWORD Size;

Free();
m_BMFH.bfReserved1=0;
m_BMFH.bfReserved2=0;
m_BMFH.bfOffBits=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) *2;
m_BMFH.bfSize=sizeof(BITMAPFILEHEADER);//整个文件大小 后面会赋值
m_BMFH.bfType=DIB_HEADER_MARKER;

m_lpBMI=new BITMAPINFO[m_BMFH.bfOffBits-sizeof(BITMAPFILEHEADER)];
if (m_lpBMI == 0)
return 0;

// 设置信息头中的信息
m_lpBMI->bmiHeader.biSize= sizeof(BITMAPINFOHEADER);
m_lpBMI->bmiHeader.biWidth= aWidth;
m_lpBMI->bmiHeader.biHeight= aHeight;
m_lpBMI->bmiHeader.biPlanes= 1;
m_lpBMI->bmiHeader.biBitCount=1;
m_lpBMI->bmiHeader.biCompression =BI_RGB;
m_lpBMI->bmiHeader.biSizeImage= BytesPerLine()*aHeight;
m_lpBMI->bmiHeader.biXPelsPerMeter = 0;
m_lpBMI->bmiHeader.biYPelsPerMeter = 0;
m_lpBMI->bmiHeader.biClrUsed=2;
m_lpBMI->bmiHeader.biClrImportant=0;

m_lpBMI->bmiColors[0].rgbRed=255;
m_lpBMI->bmiColors[0].rgbGreen=255;
m_lpBMI->bmiColors[0].rgbBlue=255;
m_lpBMI->bmiColors[0].rgbReserved= 0;

m_lpBMI->bmiColors[1].rgbRed=0;
m_lpBMI->bmiColors[1].rgbGreen=0;
m_lpBMI->bmiColors[1].rgbBlue=0;
m_lpBMI->bmiColors[1].rgbReserved= 0;


// 计算图象数据内存的大小
DWORD BitsSize=ComputeMetrics();
CreatePalette();
Size=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) *2+BitsSize;
m_BMFH.bfSize=Size;
MemDC=::CreateCompatibleDC(NULL);
hBitmap=::CreateDIBSection(MemDC,m_lpBMI,DIB_RGB_COLORS,(VOID**)&m_pBits,NULL,0);
if(hBitmap!=0)
{
hOldbmp=(HBITMAP)SelectObject(MemDC,hBitmap);
}
else
return 0;
return Size;
}

下面是打开一个位图
void CEditCardDlg::OnBnClickedButtonOpenfile()
{
  if(m_DIB)
  {
  delete m_DIB;
  m_DIB=NULL;
  }
  m_DIB=new CDib;
  if(m_DIB->CreateDib1bits(pCard->Width,pCard->Height)!=0)//创建新的空DIB
  {
  int datasz =(pCard->Width+ 7)/ 8 *pCard->Height;//要读入的文件的总字节数
  pCard->Getdata(m_DIB->m_pBits,0,datasz);//从文件读入数据到CreateDIBSection开辟的内存空间
  }
  else
  {
  //建立空DIB失败
  }
}
以上代码是主要的开辟空间读入数据 根据nbcool的指导我改的代码 现在是出现了8兆文件多次打开内存不足,这个跟WINCE申请大内存空间有没有什么关系,还是我代码的问题?

[解决办法]
CreateFileForMapping只是名字看起来怪,其实和其他内存API用法一样的,你找找例子就行了。如果你不会的话,不如先用HeapCreate,HeapAlloc分配大内存试试看效果。减少分配次数是解决你这个问题的关键。
[解决办法]
如果要用上一次的内存,

那在new后,就不要再次new了。

热点排行