这些掩码是拷贝自.cur文件的位图。在这一点上,光标资源和图标资源之间的不同点是:图标资源有颜色DIB异或掩码,而光标没有。虽然光标位图是单色位图,没有DIB头和颜色表,但为了方便处理,它们的位仍然以DIB格式存储,关于DIB格式参见SDK参考手册。
4.6 位图资源
Windows 32 可以读取两种设备无关位图(DIB)。DIB的一般类型是Windows 3.0 DIB格式。另一个类型用于OS/2 1.1和1.2版。位图资源包含一个设备无关位图,它的格式是两者之一。可通过它们的头结构来区分这两种DIB。它们的第一个域(双字)存储的都是各自结构的大小。Windows SDK参考3.0第二卷第七节对两种格式都有介绍。一般DIB的头结构是BITMAPINFOHEADER,OS/2 DIB的头结构是BITMAPCOREHEADER。正确的大小值必须赋予结构的第一项(一个双字)。
[一般资源头(type = 2)]
[BITMAPINFOHEADER 或 BITMAPCOREHEADER]
[颜色表(若不是24位图形)]
[位图数据]
注意颜色表是可选项。除24位色位图外的所有位图格式都有一个颜色表。表长度可由下述公式计算出来:
OS/2: 2×每象素位数×3(单位为字节)
Windows: 2×每象素位数×4(单位为字节)
位图数据直接放在颜色表后面。
注意:位图文件有一个未对齐的头结构(BITMAPFILEHEADER结构)。但这个头并不存储在资源文件中,因为它只对标识文件类型有用(DIB还是DDB)。
4.7 字体和字体目录资源
字体资源不同于其它的资源,它们并不会被添加到指定应用程序的资源中去。字体资源被添加到一个.exe文件中,然后更名为.fon文件,作为库供应用程序使用。
字体资源使用一个资源组结构。几种字体组件构成一个字体组。每个组件对应.rc文件中的一个FONT语句。组头包含所有访问指定字体的必要信息,后跟所有字体组件。字体组件的格式如下:
[正常资源头(type = 8)]
[后跟.fnt文件的全部内容,作为资源体(.fnt文件的格式参考Windows SDK)]
字体资源的组头通常处于.res文件的最后。但与光标和图标资源不同,在.res文件中,字体组并不需要是连续的。字体声明可能遍及整个.rc文件,与其它资源声明混在一起。组头是由资源编译器自动加在.res文件尾部的。产生.res文件的程序必须手动添加FONTDIR项。组头结构如下:
[一般资源头(type = 7)]
WORD NumberofFonts; //.res文件中包含的字体的总数
剩下的数据对每个字体都重复:
WORD fontOrdinal;
struct FontDirEntry {
WORD dfVersion;
DWORD dfSize;
char dfCopyright[60];
WORD dfType;
WORD dfPoints;
WORD dfVertRes;
WORD dfHorizRes;
WORD dfAscent;
WORD dfInternalLeading;
WORD dfExternalLeading;
BYTE dfItalic;
BYTE dfUnderline;
BYTE dfStrikeOut;
WORD dfWeight;
BYTE dfCharSet;
WORD dfPixWidth;
WORD dfPixHeight;
BYTE dfPitchAndFamily;
WORD dfAvgWidth;
WORD dfMaxWidth;
BYTE dfFirstChar;
BYTE dfLastChar;
BYTE dfDefaultChar;
BYTE dfBreakChar;
WORD dfWidthBytes;
DWORD dfDevice;
DWORD dfFace;
DWORD dfReserved;
char szDeviceName[];
char szFaceName[];
};
(待续)