字体枚举和回调函数。

 

::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)属性,但却不支持设备提供的字体。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值