EnumFontFamiliesExW 函数 (wingdi.h)
EnumFontFamiliesEx 函数枚举系统中与 LOGFONT 结构指定的字体特征匹配的所有唯一命名字体。 EnumFontFamiliesEx 基于字体名称、字符集或两者枚举字体。
语法
int EnumFontFamiliesExW(
[in] HDC hdc,
[in] LPLOGFONTW lpLogfont,
[in] FONTENUMPROCW lpProc,
[in] LPARAM lParam,
DWORD dwFlags
);
参数
[in] hdc
从中枚举字体的设备上下文的句柄。
[in] lpLogfont
指向 LOGFONT 结构的指针,该结构包含有关要枚举的字体的信息。 函数检查以下成员。
成员 | 说明 |
---|---|
lfCharSet | 如果设置为 DEFAULT_CHARSET,函数将枚举所有字符集中所有唯一命名的字体。 (如果有两种同名字体,则只枚举一种。) 如果设置为有效的字符集值,则函数仅枚举指定字符集中的字体。 |
lfFaceName | 如果设置为空字符串,则 函数枚举每个可用字样名称中的一个字体。 如果设置为有效的字样名称,则 函数枚举具有指定名称的所有字体。 |
lfPitchAndFamily | 对于操作系统的所有语言版本,必须设置为零。 |
[in] lpProc
指向应用程序定义的回调函数的指针。 有关详细信息,请参阅 EnumFontFamExProc 函数。
[in] lParam
应用程序定义的值。 函数将此值连同字体信息一起传递给回调函数。
dwFlags
未使用此参数,它必须为零。
返回值
返回值是回调函数返回的最后一个值。 此值取决于哪些字体系列可用于指定设备。
注解
EnumFontFamiliesEx 函数不使用带标记的字样名称来标识字符集。 相反,它始终将正确的字样名称和单独的字符集值传递给回调函数。 函数基于 LOGFONT 结构中 lfCharSet 和 lfFaceName 成员的值枚举字体。
与 EnumFontFamilies 一样, EnumFontFamiliesEx 枚举所有字体样式。 并非所有字体样式都涵盖相同的字符集。 例如,Fontorama Bold 可能包含 ANSI、希腊文和西里尔文字符,但 Fontorama Italic 可能只包含 ANSI 字符。 因此,最好不要假定指定的字体涵盖特定的字符集,即使它是 ANSI 字符集。 下表显示了 lfCharSet 和 lfFaceName 值的各种组合的结果。
值 | 含义 |
---|---|
lfCharSet = DEFAULT_CHARSET lfFaceName = '\0' |
枚举所有字符集中所有唯一命名的字体。 如果有两种同名字体,则仅枚举一种。 |
lfCharSet = DEFAULT_CHARSET lfFaceName = 特定字体 |
枚举特定字体中的所有字符集和样式。 |
lfCharSet =特定字符集 lfFaceName = '\0' |
枚举特定字符集中所有字体的所有样式。 |
lfCharSet =特定字符集 lfFaceName = 特定字体 |
枚举特定字符集中字体的所有样式。 |
以下代码示例演示如何使用这些值。
// 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;
EnumFontFamilies 和 EnumFontFamiliesEx 的回调函数非常相似。 main区别在于 ENUMLOGFONTEX 结构包含脚本字段。
请注意,根据 lfCharSet 和 lfFaceName 的值, EnumFontFamiliesEx 将枚举相同字体的次数与字体中存在不同的字符集一样多。 这会创建一个广泛的字体列表,这些字体可能会给用户带来负担。 例如,世纪课本字体可以针对波罗的海、西方、希腊、土耳其语和西里尔文字符集显示。 为了避免这种情况,应用程序应筛选字体列表。
许多东亚语言的字体有两个字体名称:英文名称和本地化名称。 如果系统区域设置与字体语言不匹配,则 EnumFontFamilies 和 EnumFontFamiliesEx 将返回英文字体名称。
当使用 SetGraphicsMode 函数将设备上下文中的图形模式设置为 GM_ADVANCED 并且 DEVICE_FONTTYPE 标志传递给 FontType 参数时,此函数将在系统上返回类型 1 和 OpenType 字体的列表。 当图形模式未设置为 GM_ADVANCED 时,此函数将在系统上返回类型 1、OpenType 和 TrueType 字体的列表。
注意
wingdi.h 标头将 EnumFontFamiliesEx 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名的使用与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定。
要求
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | wingdi.h (包括 Windows.h) |
Library | Gdi32.lib |
DLL | Gdi32.dll |