Obtenir un chemin de fichier de police à partir du nom et du style en C ++ / Windows

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?

  • Si vous avez juste besoin des données binarys de la police, vous pouvez utiliser GetFontData .
  • Si vous avez besoin des mésortingques de la police, vous pouvez créer un HFONT, sélectionner le HFONT dans un support de police HDC et utiliser GetOutlineTextMesortingcs .
  • Si vous avez besoin d’informations sur la liaison des fonts, jetez un coup d’oeil à mon projet: font_link.cpp .
  • Toutes les fonctions ci-dessus sont de simples fonctions GDI. Si vous avez vraiment besoin du chemin de police et que vous ne voulez pas utiliser DirectWrite, consultez IDWriteFontFile :: GetReferenceKey et IDWriteLocalFontFileLoader :: GetFilePathFromKey . Cela vous donnerait plus d’assurance future que GDI.

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()); }