::EnumFontFamilies的第二个参数NULL告诉该函数枚举所有安装了的字体。下一个参数是回调函数的地址。回调函数是 应用程序中windows用你请求 的 信息 回调的函数。对于每一个::EnumFontFamilies函数枚举的字体,windows都调用回调函数一次。::EnumFontFamilies回调函数的原型必须像下面给出的这样:int CALLBACK EnumFontFamProc(ENUMLOGFONT FAR *lpelf, NEWTEXTMETRIC FAR *lpntm, int nFontType, LPARAM lParam);
lpelf是指向ENUMLOGFONT结构的指针,包含着关于字体的丰富信息,其中包括字体名称。lpntm指向NEWTEXTMETRIC结构的指针,包含着字体度量值:高度、平均字符宽度等等。nFontType指定字体类型(TrueType字体为nFontType==TRUETYPE_FONTTYPE值)。最后一个参数lParam是传递给::EnumFontFamilies的任意32位LPARAM值。上面的例子中用了窗口类的指针。
为什么将this指针传给回调函数,因为回调函数EnumFontFamProc为静态成员函数,或为全局函数。而这类函数是没有this指针的。但是我们又要调用窗口类的成员变量,所以要通过lParam来传递this指针,这样EnumFontFamProc就可以像非静态成员函数那样访问窗口类的非静态成员了。
EnumFontFamProc为静态或全局的原因是由于“回调函数在C++应用程序中要做专门的处理”。windows严格定义了回调函数的接口,即回调函数“参数列表”传递的参数。当C++类的成员函数被声明时,编译程序会自动附加一个额外的参数来保存this指针。不幸的是,附加了参数就使回调函数的参数列表与windows期望的参数列表不匹配了,由此会导致各种问题出现,甚至包括无效内存访问错误,是windows程序员的灾难。将回调函数声明为静态成员函数是其中最简单直接的一种。在C++中不给静态成员函数传递this指针,因此它的参数列表不会改变。
EnumFontFamilies
函数功能:该函数列举“指定设备环境下”的“指定字体族”里的字体。
函数原型:int EnumFontFamilies (HDC hdc, LPCTSTR lpszFamily, FONTENUMPROC lpEnumFontFamProc, LPARAM lParam);
参数:
hdc:设备环境句柄。
lpszFamily:指向以/0结束的字符串的指针,该字符串指定期望的字体族的名字。如果lpszFamily为NULL,则EnumFontFamilies随机地选择并列举每一个有效字体族的一种字体。
lpEnumFontProc:指定应用程序定义的回调函数的地址
lParam:指向应用程序提供的数据的指针,该数据和字体信息一起传给回调函数。
备注:对每一种由参数指定其名字的字体,EnumFontFamilies获得此字体的信息,并将其传给由参数lpEnumFontFamProc指向的函数。应用程序定义的回调函数可按期望处理这些字体信息,当再没有有效字体或回调函数返回零时,列举才停止。
EnumFontFamProc
函数功能:该函数是由应用程序定义的与函数EnumFontFamilies一起使用的回调函数,它接收用于描述与可用字体的数据。类型FONTENUMPROC定义了一个指向此回调函数的指针,EnumFontFamProc是应用程序定义的函数的名字的占位符。
函数原型:int CALLBACK EnumFontFamProc(ENUMLOGFONT FAR *lpelf, NEWTEXTMETRIC FAR *lpntm, int FontType, LPARAM lParam);
参数:
lpelf:指向结构ENUMLOGFONT的指针,该结构包含字体的逻辑属性。该结构是局部定义的。
lpntm:指向结构NEWTEXTMETRIC的指针,该结构包含TrueType字体的物理属性。如果该字体不是TrueType字体,此参数为指向结构TEXTMETRIC的指针。
FontType:指定字体的类型,此参数可以是下列值的组合:
DEVICE_FONTTYPE, RASTER_FONTTYPE, TRUETYPE_FONTTYPE。
lParam:指向由函数EnumFontFamilies传来的应用程序定义的数据的指针。
返回值:要继续列举,返回值必须是非零值;要停止列举,返回值必须为0。
备注:应用程序必须将此回调函数的地址传给EnumFontFamilies以将函数注册。
RASTER_FONTTYPE, DEVICE_FONTTYPE和TRUETYPE_FONTTYPE等常数可用AND操作符连接起来决定字体的类型。如果RASTER_FONTTYPE位被设置,则该字体是一种光栅字体。如果TRUETYPE_FONTTYPE位被设置,该字体是一种TrueType字体。如果上述两位都未被设置,则该字体是一种向量字体。当一种设备(如激光打印机)支持下载TrueType字体或该字体是一种驻留设备的字体,则DEVICE_FONTTYPE位被设置,当设备是一种显示设备、点阵打印机或其他光栅设备,则该位为0。应用程序也可用DEVICE_FONTTYPE来区别图形设备接口(GDI)提供的光栅字体和设备提供的字体。GDI可以为GDI提供的光栅字体模拟粗体、斜体、下划线和删除线(strikeout)属性,但却不支持设备提供的字体。