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);
- DWORD dwMaskPixelsInStreamOffset,dwMaskBmpiInStreamOffset;
- LPBYTE pMaskPixelsInStream;
- LPBITMAPINFOHEADER pMaskBmpiInStream;
- C
自定义ImageList序列化:ImageList_Write2与ImageList_Read2实现

本文介绍了在Windows编程中,为适应非IStream二进制流类,作者自定义实现了ImageList_Write2和ImageList_Read2函数,用于序列化和反序列化ImageList对象。这些函数通过处理图像和掩码位图的数据,保存和加载ImageList的内容。详细代码展示了如何操作HIMAGELIST并进行数据流操作。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



