Windows ICON 详解

来源:互联网 发布:业余程序员该如何赚钱 编辑:程序博客网 时间:2024/06/05 19:07

PS:此文章为初入工作时做的笔记,放qq空间里无人问津,这么好的文章没人看,浪费了。


Windows ICON

       win 32 注册窗口时,用LoadIcon()加载ICON图标时,VS2008打开ICON图标发现,一个ICON图标里有多个BMP图片数据。不同SIZE.仔细baidu.google,发现了一点点知识。贴上;
    windows ICON 有其固定的几种size ,对于xp NT,标准是48*48(256),还有其他大小,32*32(256色彩),16*16(256色彩),windows 支持的色彩model,有16色彩,256色彩,还有真彩RGB.一个标准的ICON图标里还应该含有RGB/A色彩model的sizeBMP.所以一个完善的ICON图标还有48*48(RGB),32*32(RGB),16*16(RGB),当然为了支持后续的系统版本,还有超大图标256*256(VISTA系统中使用,但是在win7 中也用到了)。MAC系统中也有使用。不过MAC不适用ICON.用图片软件打开只能显示最后一个图标;
    一个ICON图标里包含多个size,使得System能够使用一个ICON,便能用不同zixe显示图标,如在桌面上程序图标48*48,EXE窗口上16*16,当用户选择文件浏览里,便有大图标,小图标,超大图标显示功能。至于window是怎么知道什么时候用大图标,什么时候用小图标,怎么实现的?暂时不清楚。 
 ICON ,图标结构:
一个ICON图标里的BMP位图数据中其实包含了两个位图,一个是AND(逻辑与)位图,一个是xor(异或)位图。AND位图相当于是个蒙版图片。假设要显示的图标是红桃心,那么这个AND位图,用0来形成心的形状(像素显示黑色),其他则是1,白色。先将AND图与图标所在位置背景区域里进行AND运算,那么,该区域里,与黑色心形AND的区域都成为0,都是黑色了,但其他部分则保留原来背景区域色彩。然后和XOR位图进行XOR运算。XOR位图里红色的心形存储真实色彩数据,心形外的则为黑色用0表示。进行XOR运算,与0运算的数据即为原来数据,所以,形成图案显示,背景透明和原来一致。

具体参考http://wenku.baidu.com/view/818c9c6b011ca300a6c390c7.html

 icon文件数据格式:
文件头(6)字节
WORD idresserved //双字节大小,保留字必须是0;
WORD idtype //资源类型,1为ICON,2为光标
WORD Idcount   //文件里有几个图像

图像索引信息块(1)16字节  有多少个图像就有多少个信息索引快
byte        bwidth;          // width, in pixels, of the image
byte        bheight;         // height, in pixels, of the image
byte        bcolorcount;     // number of colors in image (0 if >=8bpp)
byte        breserved;       // reserved ( must be 0)
word        wplanes;         // color planes
word        wbitcount;       // bits per pixel
dword       dwbytesinres;    // how many bytes in this resource?
dword       dwimageoffset;   // where in the file is this image?

////
////
////
 
 BMP图像信息头(40字节)有多少个图像就有多少个信息头
C中定义:
typdef struct
{
bitmapinfoheader   icheader;      // dib header
rgbquad         iccolors[1];   // color table
byte            icxor[1];      // dib bits for xor mask
byte            icand[1];      // dib bits for and mask
} iconimage, *lpiconimage;
 
////
////
////
接下来就是xor调色板,(这个还是有点含糊)
////
接下来是xor位图,以调色板里的值存放;
然后是AND位图。

所看到这里,也大概知道ICON结构原理。 用软件打开ICON,发现ICON里存放也是有规律的,先RGB模式48*48,32*32,16*16,然后是超大模式256*256.然后是低色彩模式48*48 ,32*32 16*16.
猜测Window 回根据窗口句柄去遍历ICON的SIZE,根据context表中维护的全局宏来对应load哪一个大小的ICON.如果没有该size的,则匹配最适合的。这也就是有的程序图标当我们放大时,还是那么小,丫的,人家最大就那么点点。
      知道了图标格式构成,能不能readfile and writefile ,自己用程序写一个ICON呢??有时间尝试下。如果在ICON 加入一些SHELL code?


0 0
原创粉丝点击