原文链接 -> 传送门
函数功能:
EnumFontFamiliesEx 函数用于枚举系统里所有符合由 LOGFONT 结构指定的字体特性的唯一命名的字体。EnumFontFamiliesEx 函数基于字样名或字符集或两者来枚举字体。
API 函数原型:
注释:_In_ 说明该参数是输入的。
int EnumFontFamiliesEx(
_In_ HDC hdc,
_In_ LPLOGFONT lpLogfont,
_In_ FONTENUMPROC lpEnumFontFamExProc,
_In_ LPARAM lParam,
DWORD dwFlags
);
参数解析:
|
参数 |
含义 |
||||||||
|
hdc |
指定从中枚举字体的设备环境句柄 |
||||||||
|
lpLogfont |
指向包含关于枚举的字体的信息的 LOGFONT 结构的指针。函数检查以下成员:
|
||||||||
|
lpEnumFontFamExProc |
指向应用程序自定义的回调函数的指针。更多信息,查看 EnumFontFamProc 函数 |
||||||||
|
lParam |
指向应用程序供给的数据的指针,该数据和字体信息一起传给回调函数 |
||||||||
|
dwFlags |
此参数未被使用,必须为 0 |
返回值:
返回值是由回调函数返回的最后一个值,此值依赖于指定设备的可能的字体族。
备注:
1. EnumFontFamiliesEx 函数不使用带标记的字样名来标识字符集,相反,总是传递正确的字样名和单独的字符集值给回调函数,此函数基于 LOGFONT 结构里的 lfCharset 和 lfFacename 值来枚举字体。
2. 与 EnumFontFamilies 函数一样,EnumFontFamiliesEx 函数枚举所有的字体样式。并不是一种字体覆盖相同的字符集的所有的字体样式。例如,Fontorama Bold 可能包含 ANSI、 希腊语和西里尔字母字符集,但 Fontorama Italic 可能只包含 ANSI 字符集。为此,最好不要假定一种指定的字体涵盖特定的字符集,即使它是 ANSI 字符集。下表显示 lfCharSet 和 lfFaceName 的值的各种组合的结果:
|
值 |
含义 |
|
lfCharSet = DEFAULT_CHARSET |
枚举所有字符集内的所有唯一命名字体。如果存在具有相同名称的两种字体,只有一个被枚举 |
|
lfCharSet = DEFAULT_CHARSET |
枚举所有字符集和特定字体的样式 |
|
lfCharSet =a specific character set |
枚举指定字符集中的所有字体的所有样式 |
|
lfCharSet =a specific character set |
枚举一个指定字符集中的一种字体的所有样式 |
3. 下面的示例代码显示了怎样使用这些值:
// To enumerate all styles and charsets of all fonts:
lf.lfFaceName[0] = '\0';
lf.lfCharSet = DEFAULT_CHARSET;
HRESULT hr;
// To enumerate all styles and character sets of the Arial font:
hr = StringCchCopy( (LPSTR)lf.lfFaceName, LF_FACESIZE, "Arial" );
if (FAILED(hr))
{
// TODO: write error handler
}
lf.lfCharSet = DEFAULT_CHARSET;
// To enumerate all styles of all fonts for the ANSI character set
lf.lfFaceName[0] = '\0';
lf.lfCharSet = ANSI_CHARSET;
// To enumerate all styles of Arial font that cover the ANSI charset
hr = StringCchCopy( (LPSTR)lf.lfFaceName, LF_FACESIZE, "Arial" );
if (FAILED(hr))
{
// TODO: write error handler
}
lf.lfCharSet = ANSI_CHARSET;
4. EnumFontFamilies 函数和 EnumFontFamiliesEx 函数的回调函数是非常相似的。主要的区别是,ENUMLOGFONTEX 结构包括一个脚本字段。
5. 注意:基于 lfCharSet 和 lfFaceName 的值,EnumFontFamiliesEx 函数将枚举字体中相同的字体的次数和互不相同的字符集的数量相同。这可以创建广泛的字体列表,这对于用户来说是难以负担的。例如,Century Schoolbook 字体可以显示 Baltic、Western、Greek、Turkish 和 Cyrillic 字符集。要避免这种情况,应用程序应筛选字体的列表。
6. 对于许多东亚语言字体有两个字体名称︰ 英文名称和本地化的名称。如果系统区域设置与字体的语言不匹配,EnumFonts、 EnumFontFamilies 和 EnumFontFamiliesEx 函数返回英文字体名称。
7. 当使用 SetGraphicsMode 函数将设备环境的图形模式设置为 GM_ADVANCED ,且DEVICE_FONTTYPE 标志传递给 FontType 参数时,此函数返回类型 1 和系统上的 OpenType 字体。当图形模式未设置为 GM_ADVANCED 时,此函数返回一个列表的类型 1、 系统上的 OpenType 和 TrueType 字体。
需求:
|
Minimum supported client |
Windows 2000 专业版 [仅桌面应用程序] |
|
Minimum supported server |
Windows 2000 服务器版 [仅桌面应用程序] |
|
Header |
Wingdi.h (包含于 Windows.h) |
|
Library |
Gdi32.lib |
|
DLL |
Gdi32.dll |
|
Unicode and ANSI names |
EnumFontFamiliesExW (Unicode) 和 EnumFontFamiliesExA (ANSI) |




