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

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位被设置,则此项为弹出式的。否则它就是一个一般菜单项。还有几个其它的位标志:
(待续)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值