gpt4 book ai didi

c++ - 如何使用 C++ 获取 Windows 上已安装字体的列表,包括字体样式

转载 作者:行者123 更新时间:2023-12-01 14:52:19 27 4
gpt4 key购买 nike

我一直在尝试获取 Windows 上已安装字体的列表,包括字体样式。

经过调查,我发现我需要使用:EnumFontFamiliesEx。我使用它,但我只得到字体名称,而不是该字体的所有样式。

例如:对于字体:“Verdana”

enter image description here

有四种不同的样式,但我只有一种 - 常规。我的问题是:如何获得包含所有样式的字体列表?

我的代码:

void getFonts()
{
LOGFONT lf;
memset(&lf, 0, sizeof(lf));
lf.lfCharSet = DEFAULT_CHARSET;
HDC hDC = GetDC(NULL);
EnumFontFamiliesEx(hDC, &lf, (FONTENUMPROC)(EnumFontFamExProc), NULL, 0);
}

int CALLBACK EnumFontFamExProc(
ENUMLOGFONTEX *lpelfe,
NEWTEXTMETRICEX *lpntme,
DWORD FontType,
LPARAM lParam
)
{
UTF8String fontName = (lpelfe->elfFullName);
return 1;
}

ENUMLOGFONTEX *lpelfe - 包含字体。但我没有得到所有不同的风格

经过更多调查,我发现如果我将 lfFaceName 更改为特定字体,该方法会返回所有样式。

// 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" );

所以我不确定我应该做什么,我需要获取所有已安装字体的所有样式。

提前致谢

最佳答案

查看 EnumFontFamiliesEx 的详细信息,专门针对 lfFaceName 参数:

If set to an empty string, the function enumerates one font in each available typeface name. If set to a valid typeface name, the function enumerates all fonts with the specified name.

最常见的情况是获取要在字体选择 UI(例如,下拉列表)中显示的家庭列表,而不是所有个人面孔。出于这个原因,如果您调用时将 lfFacename 设置为“”,那么您将得到:家庭列表。如果您真的想要获取所有个人面孔(每个家庭有多个面孔),那么您需要在 EnumFontFamiliesExProc 回调中递归调用,在内部循环中将家族名称作为 lfFaceName 传递——您可以只需使用传递给回调的 LOGFONT 作为对 EnumFontFamiliesEx 的内部循环调用的参数:

int CALLBACK GdiFontEnumeration::EnumFontFamiliesExCallback(
_In_ const ENUMLOGFONTEX *lpelfe,
_In_ const NEWTEXTMETRICEX *lpntme,
_In_ DWORD dwFontType,
_In_ LPARAM lParam
)
{
// If no facename parameter was passed in the command line, then
// lParam will be 0 the first time the callback is called for a
// given family. We'll call EnumFontFamiliesEx again passing the
// LOGFONT, and that way we'll get callbacks for the variations
// within the given family. When making the inner-loop call, set
// lParam = 1 so that we don't keep recursing.

if (lParam == 0)
{
LOGFONT lf = lpelfe->elfLogFont;
HDC hdc = CreateDC(L"DISPLAY", NULL, NULL, NULL);
int result = EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumFontFamiliesExCallback, 1, 0);
}
else
...

关于c++ - 如何使用 C++ 获取 Windows 上已安装字体的列表,包括字体样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62369560/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com