HFONT CreateFont(
int nHeight, // height of font
int nWidth, // average character width
int nEscapement, // angle of escapement
int nOrientation, // base-line orientation angle
int fnWeight, // font weight
DWORD fdwItalic, // italic attribute option
DWORD fdwUnderline, // underline attribute option
DWORD fdwStrikeOut, // strikeout attribute option
DWORD fdwCharSet, // character set identifier
DWORD fdwOutputPrecision, // output precision
DWORD fdwClipPrecision, // clipping precision
DWORD fdwQuality, // output quality
DWORD fdwPitchAndFamily, // pitch and family
LPCTSTR lpszFace // typeface name
);
对于fdwCharSet和lpszFace两个参数以及他们的关系,刚开始不是很理解,所以google了一些资料,对这个问题有了一点自己的认识。fdwCharSet参数用来设置字符集,lpszFace用来确定显示字体。字符集说白了就是文字的集合,拿BIG5字符集来说,该字符集收入一万多个繁体汉字,八百多个符号,普遍使用于台湾、香港等地区。
字符其实是由二进制数字来表示的,通过映射表映射到字符集中的某个字符。换句话说,同一个二进制数字,在不同的字符集里可能就代表不同的字符。字符集是文字的集合,但字符集中的字符可能需要编码之后才能应用。比如GB2312可以使用ISO 2022、EUC等标准进行编码,编码之后可以进行网络传输或处理等等。而字体,就是字的形体,也就是字的几何形状。比如,宋体字看起来比较正式,楷体字看起来比较飘逸。
Msdn中关于CreateFont函数有很详细的介绍:fdwCharSet参数可以设置为:
ANSI_CHARSET
BALTIC_CHARSET
CHINESEBIG5_CHARSET
DEFAULT_CHARSET
EASTEUROPE_CHARSET
GB2312_CHARSET
GREEK_CHARSET
HANGUL_CHARSET
MAC_CHARSET
OEM_CHARSET
RUSSIAN_CHARSET
SHIFTJIS_CHARSET
SYMBOL_CHARSET
TURKISH_CHARSET
VIETNAMESE_CHARSET
下面看几种字符集的简单介绍。
一 GB2313字符集,收入汉字6763个,符号715个,总计7478个字符,这是大陆普遍使用的简体字符集。楷体-GB2313、仿宋-GB2313、华文行楷等市面上绝大多数字体支持显示这个字符集。
二 BIG-5字符集,收入13060个繁体汉字,808个符号,总计13868个字符(包括了无简体与繁体之分的传统传承汉字),目前普遍使用于台湾、香港等地区。台湾教育部标准宋体楷体等港台字体都支持这个字符集的显示。
三 GBK字符集,又称大字符集,包含以上两种字符集汉字。收入21003个汉字,882个符号,共计21885个字符。Windows 95/98简体中文版就带有这个GBK.txt文件。宋体、隶书、黑体、幼圆、华文中宋、华文细黑、华文楷体、标楷体(DFKai-SB)、Arial Unicode MS、MingLiU、PMingLiU等字体支持显示这个字符集。
从这几个字符集的介绍中,也可以看出一个问题,就是字体对字符集有一个支持问题。我自己是这么理解的,比如某个字符集只包含有英文字符,那么宋体或者楷体就不支持这个字符集,因为宋体或者楷体是针对我们汉字来说的。这就可以解释msdn中给程序员的一个警示:“If you specify a typeface name in the lpszFace parameter, make sure that the fdwCharSet value matches the character set of the typeface specified in lpszFace.”