ImageList是windows上一个比较重要的对象,可以方便的管理一串图标,其中ImageList_Write和ImageList_Read这两个API为我们提供了一个序列化ImageList的方法,但必须使用IStream接口来操作。在上次开发的一个工程中,因为使用了一个不同于IStream的二进制流类,为了使用该流进行ImageList的保存,我重新实现了自己的ImageList_Write2和ImageList_Read2.
下面贴出代码:
- BOOL HTImageListWrite2(HIMAGELIST img,CStream &s)
- {
- INT dx,dy ;
- IMAGEINFO imginf;
- BITMAP bmp;
- INT i;
- WORD bitCount=32;
- INT nTotalImages=ImageList_GetImageCount(img);
- INT nValidImages=nTotalImages;
- ImageList_GetIconSize(img,&dx,&dy);
- s <<dx
- <<dy
- <<ImageList_GetBkColor(img);//background color
- if(nTotalImages<=0){
- s<<bitCount;
- }else{
- ImageList_GetImageInfo(img,0,&imginf);
- GetObject(imginf.hbmImage,sizeof(BITMAP),(LPSTR)&bmp);
- s<<bmp.bmBitsPixel;//颜色位数
- }
- s <<nTotalImages;
- if(nTotalImages<=0){
- LOG0('E',"HTImageListWrite2","No valid iamges/r/n");
- return TRUE;
- }
- HDC hdcDevice=GetDC(NULL);
- DWORD dwImgPixelsInStreamOffset,dwImgBmpiInStreamOffset;
- LPBYTE pImgPixelsInStream;
- LPBITMAPINFOHEADER pImgBmpiInStream;
- CreateBitmapStream(hdcDevice,imginf.hbmImage,dx,dy*nValidImages,s,
- &dwImgBmpiInStreamOffset,&dwImgPixelsInStreamOffset);
- DWOR