Win32 二进制资源格式(续四)

    技术2022-05-11  79

    4. 资源数据格式 对任何预定义的数据类型,所有结构都是双字对齐的,包括位图、图标、字体头结构等等。因此,数据总是从双字边界开始。 4.1 版本资源 版本资源用来记录使用资源文件的程序的版本。版本资源包含固定数量的信息。它的结构如下: typedef struct tagVS_FIXEDFILEINFO {     DWORD    dwSignature;        //e.g.    0xfeef04bd     DWORD    dwStrucVersion;        //e.g.    0x00000042 = "0.42"     DWORD    dwFileVersionMS;    //e.g.    0x00030075 = "3.75"     DWORD    dwFileVersionLS;    //e.g.    0x00000031 = "0.31"     DWORD    dwProductVersionMS;    //e.g.    0x00030010 = "3.10"     DWORD    dwProductVersionLS;    //e.g.    0x00000031 = "0.31"     DWORD    dwFileFlagsMask;    // = 0x3f 对应版本 "0.42"     DWORD    dwFileFlags;        //e.g.    VFF_DEBUG | VFF_PRERELEASE     DWORD    dwFileOS;            //e.g.    VOS_DOS_WINDOWS16     DWORD    dwFileType;            //e.g.    VFT_DRIVER     DWORD    dwFileSubType;        //e.g.    VFT2_DRV_KEYBOARD     DWORD    dwFileDateMS;        //e.g.    0     DWORD    dwFileDateLS;        //e.g.    0     } VS_FIXEDFILEINFO; 4.2 图标资源 .RC脚本中的ICON语句创建的并不是一个单独的资源对象,而是一组资源。这使得Windows程序具有一定的设备独立性(根据不同的硬件配置使用不同的象素位图图标)。Windows组合一组不同象素位数和个数的位图并将它们作为一个图标资源。但在.RES和.EXE文件中,它们被以一组资源的格式存储。这些组被以组件(在此,是不同的图标[type 3])在前,后跟组头信息([Type 14])的格式存储。组头包含必要的信息以使Windows能够选择合适的图标来显示。 组件有如下的格式:     [资源头(type = 3)]         [DIB头]     [图标XOR(异或)掩码的颜色DIBits (Color DIBits of icon XOR mask)]     [AND(与)掩码的单色DIBits (Monochrome DIBits of AND mask)] 每个组件都有一个唯一的序数ID(相对于其它图标组件)。 DIB(设备无关位图)头的域分别描述了掩码的信息,仅有两项例外。第一,高度域同时描述 异或 和 与掩码。在将两个DIB转换为DDB(设备相关位图)之前,高度应当被除2。掩码的大小是固定的,占DIB头大小的一半。第二,每个象素的位数和位的数量参考异或掩码。与掩码总是单色的,只有一个面,每象素一位。在使用图标之前,请先参考一下windows sdk参考材料中关于DIB的信息。由于图标组件的格式与.ico文件非常相似,因此Windows SDK参考文档的9.2节还是很有用的。Windows 32应用程序不应使用DDB。 组头如下描述:     [组头(type = 14)] struct IconHeader {   WORD   wReserved;          // 当前为0   WORD   wType;              // 图标在此等于1   WORD   wCount;             // 组件的数量   WORD   padding;            // 为使双字对齐的填充数据   }; 下面的结构每个组件都有一个: struct ResourceDirectory {   BYTE   bWidth;   BYTE   bHeight;   BYTE   bColorCount;   BYTE   bReserved;   WORD   wPlanes;   WORD   wBitCount;   DWORD  lBytesInRes;        // 指向组件   WORD   wNameOrdinal;   WORD   padding;            // 填充数据   };      注意:组头由固定的头和重复的组件数据组成。这两部分都有固定的长度,以使能对组件信息进行随机访问。 组头包含了所有来自.ico头和资源描述器的数据。 4.3 菜单资源 菜单资源由一个菜单头后跟一个菜单项的序列组成。有两种类型的菜单项:弹出式(popup)的和一般的菜单项。MENUITEM SEPERATOR是一种特殊的一般菜单项,它的名称为空、ID为0、标志也为0。它们的格式如下:     [资源头(type = 4)] struct MenuHeader {   WORD   wVersion;           //当前为0   WORD   cbHeaderSize;       //也为0   }; 下面这些项对每一个菜单项都重复: 弹出式菜单项(以 fItemFlags & POPUP 为标志): struct PopupMenuItem {   WORD   fItemFlags;   WCHAR  szItemText[];   };      一般菜单项(以 !(fItemFlags & POPUP) 为标志):   struct NormalMenuItem {   WORD   fItemFlags;   WORD   wMenuID;   WCHAR  szItemText[];   };      wVersion与cbHeaderSize结构成员标识菜单模板的版本。对Windows3.0它们皆为0,但将来可能会增加。 单字fItemFlags是一个描述菜单项的标志集合。若POPUP位被设置,则此项为弹出式的。否则它就是一个一般菜单项。还有几个其它的位标志: (待续)

    最新回复(0)