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

时间:2022-08-06 20:55:33

这些掩码是拷贝自.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[];
  };
     (待续)