gpt4 book ai didi

c++ - 在 C++/Windows 中从名称和样式获取字体文件路径

转载 作者:可可西里 更新时间:2023-11-01 13:02:58 25 4
gpt4 key购买 nike

我目前正在我的一个项目中实现 FreeType 2,因此我的系统上需要字体的文件路径。我需要一个只采用字体名称和所需字体样式(例如 bolditalic)然后返回字体文件路径的解决方案。

我已经尝试过这个 Stack Overflow question 的答案,但它不适用于 Windows 7(可能也不适用于 Vista),但显然我需要一种适用于这些系统和 future 系统的解决方案。

最佳答案

我曾经为 Windows 平台编写代码来查找基于“Arial Bold”或类似名称的字体文件。代码贴在下面。它正在扫描注册表并尝试找到字体名称与 Windows 字体目录中文件的匹配项。它可能不是防弹的,但它确实起到了一定的作用。获得文件名后,您可以将其传递给 FreeType。

// Get system font file path
std::string GetSystemFontFile(const std::string &faceName) {

static const LPWSTR fontRegistryPath = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts";
HKEY hKey;
LONG result;
std::wstring wsFaceName(faceName.begin(), faceName.end());

// Open Windows font registry key
result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, fontRegistryPath, 0, KEY_READ, &hKey);
if (result != ERROR_SUCCESS) {
return "";
}

DWORD maxValueNameSize, maxValueDataSize;
result = RegQueryInfoKey(hKey, 0, 0, 0, 0, 0, 0, 0, &maxValueNameSize, &maxValueDataSize, 0, 0);
if (result != ERROR_SUCCESS) {
return "";
}

DWORD valueIndex = 0;
LPWSTR valueName = new WCHAR[maxValueNameSize];
LPBYTE valueData = new BYTE[maxValueDataSize];
DWORD valueNameSize, valueDataSize, valueType;
std::wstring wsFontFile;

// Look for a matching font name
do {

wsFontFile.clear();
valueDataSize = maxValueDataSize;
valueNameSize = maxValueNameSize;

result = RegEnumValue(hKey, valueIndex, valueName, &valueNameSize, 0, &valueType, valueData, &valueDataSize);

valueIndex++;

if (result != ERROR_SUCCESS || valueType != REG_SZ) {
continue;
}

std::wstring wsValueName(valueName, valueNameSize);

// Found a match
if (_wcsnicmp(wsFaceName.c_str(), wsValueName.c_str(), wsFaceName.length()) == 0) {

wsFontFile.assign((LPWSTR)valueData, valueDataSize);
break;
}
}
while (result != ERROR_NO_MORE_ITEMS);

delete[] valueName;
delete[] valueData;

RegCloseKey(hKey);

if (wsFontFile.empty()) {
return "";
}

// Build full font file path
WCHAR winDir[MAX_PATH];
GetWindowsDirectory(winDir, MAX_PATH);

std::wstringstream ss;
ss << winDir << "\\Fonts\\" << wsFontFile;
wsFontFile = ss.str();

return std::string(wsFontFile.begin(), wsFontFile.end());
}

关于c++ - 在 C++/Windows 中从名称和样式获取字体文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11387564/

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