J’implémente actuellement FreeType 2 dans un de mes projets et j’ai donc besoin des chemins de fichiers pour les fonts sur mon système. J’ai besoin d’une solution qui ne prend que le nom de la police et le style de police souhaité (par exemple, gras ou italique ) et renvoie ensuite le chemin du fichier pour la police.
J’ai déjà essayé la réponse à cette question de Stack Overflow , mais elle ne fonctionne pas sous Windows 7 (et probablement pas sous Vista), mais j’ai évidemment besoin d’une solution qui fonctionne également sur ces systèmes et systèmes futurs.
Puis-je vous demander pourquoi vous avez besoin du chemin vers un fichier physique?
Une fois, j’ai écrit le code pour la plate-forme Windows pour trouver un fichier de police basé sur “Arial Bold” ou un tel nom. Le code est affiché ci-dessous. Il parsing le Registre et tente de trouver une correspondance pour le nom de la police avec un fichier dans le répertoire des fonts Windows. Ce n’est peut-être pas à l’épreuve des balles, mais cela a fait du travail. Une fois que vous avez le nom du fichier, vous pouvez le transmettre à FreeType.
// Get system font file path std::ssortingng GetSystemFontFile(const std::ssortingng &faceName) { static const LPWSTR fontRegistryPath = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"; HKEY hKey; LONG result; std::wssortingng 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::wssortingng 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::wssortingng 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::wssortingngstream ss; ss << winDir << "\\Fonts\\" << wsFontFile; wsFontFile = ss.str(); return std::string(wsFontFile.begin(), wsFontFile.end()); }