要将一个目录中的BMP文件依次调入显示在ListCtrl控件中,上面显示图标,下面是对应的图标名称,现在我已经得到了目录位图文件的相关信息,接下来怎么显示在ListCtrl控件,请各位大侠帮帮忙!!!!
下面是我得到位图文件相关信息的代码: //读取文件信息头
file.Read(&bi,sizeof(bi));
//计算调色板数目
numQuad=0;
if(bi.biBitCount<24)
{
numQuad=1<<bi.biBitCount;
}
//为图象信息pbi申请空间
pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD));
memcpy(pbi,&bi,sizeof(bi));
quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER)); //读取调色板
if(numQuad!=0)
{
file.Read(quad,sizeof(RGBQUAD)*numQuad);
} //为图象数据申请空间
bi.biSizeImage=bf.bfSize-bf.bfOffBits;
lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
//读取图象数据
file.Read(lpBuf,bi.biSizeImage); lpshowbuf=NULL;
////////////////////////////////////////////////////////////////////////////////
BYTE** image;
BYTE** originimage;
int i,j;
int linewidth;
pbi->bmiHeader.biHeight=bi.biHeight/4;
pbi->bmiHeader.biWidth=bi.biWidth/4; //每行四字节补齐,计算每行字节数:
linewidth=(pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32*4;
//计算显示图像所需内存大小
pbi->bmiHeader.biSizeImage=linewidth*pbi->bmiHeader.biHeight;
//申请内存
lpshowbuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,pbi->bmiHeader.biSizeImage);
//生成对lpshowbuf的二维数组索引:
image=new BYTE*[pbi->bmiHeader.biHeight];
for(i=0;i<pbi->bmiHeader.biHeight;i++)
image[i]=lpshowbuf+i*linewidth;
originimage=new BYTE*[bi.biHeight];
for(i=0;i<bi.biHeight;i++)
originimage[i]=lpBuf+i*bi.biSizeImage/bi.biHeight; //赋值
if(bi.biBitCount<24)
{
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<linewidth;j++)
image[i][j]=originimage[i*4][j*4];
}
else if(bi.biBitCount==24)
{//24位真彩色
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<pbi->bmiHeader.biWidth;j++)
{
image[i][j*3]=originimage[i*4][(j*4)*3];
image[i][j*3+1]=originimage[i*4][(j*4)*3+1];
image[i][j*3+2]=originimage[i*4][(j*4)*3+2];
}
}
else
{//32位色
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<pbi->bmiHeader.biWidth;j++)
{
image[i][j*4]=originimage[i*4][(j*4)*4];
image[i][j*4+1]=originimage[i*4][(j*4)*4+1];
image[i][j*4+2]=originimage[i*4][(j*4)*4+2];
image[i][j*4+3]=originimage[i*4][(j*4)*4+3];
}
}
下面是我得到位图文件相关信息的代码: //读取文件信息头
file.Read(&bi,sizeof(bi));
//计算调色板数目
numQuad=0;
if(bi.biBitCount<24)
{
numQuad=1<<bi.biBitCount;
}
//为图象信息pbi申请空间
pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD));
memcpy(pbi,&bi,sizeof(bi));
quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER)); //读取调色板
if(numQuad!=0)
{
file.Read(quad,sizeof(RGBQUAD)*numQuad);
} //为图象数据申请空间
bi.biSizeImage=bf.bfSize-bf.bfOffBits;
lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
//读取图象数据
file.Read(lpBuf,bi.biSizeImage); lpshowbuf=NULL;
////////////////////////////////////////////////////////////////////////////////
BYTE** image;
BYTE** originimage;
int i,j;
int linewidth;
pbi->bmiHeader.biHeight=bi.biHeight/4;
pbi->bmiHeader.biWidth=bi.biWidth/4; //每行四字节补齐,计算每行字节数:
linewidth=(pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32*4;
//计算显示图像所需内存大小
pbi->bmiHeader.biSizeImage=linewidth*pbi->bmiHeader.biHeight;
//申请内存
lpshowbuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,pbi->bmiHeader.biSizeImage);
//生成对lpshowbuf的二维数组索引:
image=new BYTE*[pbi->bmiHeader.biHeight];
for(i=0;i<pbi->bmiHeader.biHeight;i++)
image[i]=lpshowbuf+i*linewidth;
originimage=new BYTE*[bi.biHeight];
for(i=0;i<bi.biHeight;i++)
originimage[i]=lpBuf+i*bi.biSizeImage/bi.biHeight; //赋值
if(bi.biBitCount<24)
{
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<linewidth;j++)
image[i][j]=originimage[i*4][j*4];
}
else if(bi.biBitCount==24)
{//24位真彩色
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<pbi->bmiHeader.biWidth;j++)
{
image[i][j*3]=originimage[i*4][(j*4)*3];
image[i][j*3+1]=originimage[i*4][(j*4)*3+1];
image[i][j*3+2]=originimage[i*4][(j*4)*3+2];
}
}
else
{//32位色
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<pbi->bmiHeader.biWidth;j++)
{
image[i][j*4]=originimage[i*4][(j*4)*4];
image[i][j*4+1]=originimage[i*4][(j*4)*4+1];
image[i][j*4+2]=originimage[i*4][(j*4)*4+2];
image[i][j*4+3]=originimage[i*4][(j*4)*4+3];
}
}
///////////////////////////////////////////
CImageList m_ImgList;
HIMAGELIST hImgList=ImageList_Create(设定ListCtrl中显示的图像的宽,设定ListCtrl中显示的图像的高,ILC_COLOR24,0,10);
m_ImgList.Attach(hImgList);
// Use the image list in the list view
m_ListCtrl.SetImageList(&m_ImgList, LVSIL_NORMAL);
m_ListCtrl.SetImageList(&m_ImgList, LVSIL_SMALL);
///////////////////////////////////////////////////////
// hold the window update to avoid flicking
m_ListCtrl.SetRedraw(FALSE);
// reset our image list
for(int i=0; i<m_ImgList.GetImageCount(); i++)
m_ImgList.Remove(i);// remove all items from list view
if(m_ListCtrl.GetItemCount()!=0)
m_ListCtrl.DeleteAllItems();// set the size of the image list
m_ImgList.SetImageCount(要装载的图像个数);//获得ListCtrl的区域
CRect rect;
m_ListCtrl.GetClientRect(&rect);
//////////////////////////////////////////
for(装载的位图个数)
{
根据装入的图像的信息创建一个空的位图。
HBITMAP bmp=::CreateDIBSection(NULL,
(LPBITMAPINFO)(图像的Bitmap信息),
DIB_RGB_COLORS,
NULL,
NULL,
0);HDC hMemDC = ::CreateCompatibleDC(NULL);
HGDIOBJ hOldObj = NULL;
////////////////
将bmp装入内存
hOldObj = ::SelectObject(hMemDC,bmp);
CRect m_r;用SetStretchBltMode(
hMemDC, // handle to device context
COLORONCOLOR // bitmap stretching mode
);
在图像缩小显示时可删除多余行,以防止图像显示时有杂色出现。再用StretchDIBits显示图像在hMemDC上。dummy=new CBitmap();
dummy->Attach(bmp);
//add bitmap into listctrl
m_ImgList.Replace(m_nImgListCount,dummy,NULL);//
delete dummy;int item=m_ListCtrl.InsertItem(m_nImgListCount,图像名称, m_nImgListCount);m_nImgListCount++;
}
在关闭程序前切记释放m_ImgList;
for(int i=0; i<m_ImgList.GetImageCount(); i++)
m_ImgList.Remove(i);