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 结构中的 lfCharSetlfFaceName 成员的值枚举字体。

EnumFontFamilies一样,EnumFontFamiliesEx 枚举所有字体样式。 并非所有字体样式都涵盖相同的字符集。 例如,Fontorama Bold 可能包含 ANSI、希腊文和西里尔文字符,但 Fontorama Italic 可能仅包含 ANSI 字符。 因此,最好不要假定指定的字体涵盖特定的字符集,即使它是 ANSI 字符集。 下表显示了 lfCharSetlfFaceName的各种值组合的结果。

意义
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;

EnumFontFamiliesEnumFontFamiliesEx 的回调函数非常相似。 主要区别在于,ENUMLOGFONTEX 结构包括脚本字段。

请注意,根据 lfCharSetlfFaceName的值,EnumFontFamiliesEx 将枚举与字体中不同字符集的相同字体。 这可以创建一个广泛的字体列表,这可能会给用户带来负担。 例如,世纪学校手册字体可以出现在波罗的海、西方、希腊、土耳其和西里尔文字符集。 为了避免这种情况,应用程序应筛选字体列表。

许多东亚语言的字体有两个字号:英语名称和本地化名称。 EnumFontsEnumFontFamiliesEnumFontFamiliesEx 如果系统区域设置与字体语言不匹配,则返回英语字样名称。

当设备上下文上的图形模式设置为使用 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 [仅限桌面应用]
目标平台 窗户
标头 wingdi.h (包括 Windows.h)
Gdi32.lib
DLL Gdi32.dll

另请参阅

EnumFontFamExProc

EnumFontFamilies

EnumFonts

字体和文本功能

字体和文本概述

LOGFONT