2012-07-08 30 views
5

私は現在、私のプロジェクトでFreeType 2を実装しているので、私のシステム上のフォントのファイルパスが必要です。フォント名と目的のフォントスタイル(例:太字またはイタリック)だけを取り、フォントのファイルパスを返すソリューションが必要です。C++/Windowsで名前とスタイルからフォントファイルパスを取得

私はすでにこの回答をStack Overflow questionから試みましたが、Windows 7(およびおそらくVistaではなく)では動作しませんが、明らかにこれらのシステムおよび将来のシステムでも機能するソリューションが必要です。

+0

リンクされた回答のように、このようなAPIは存在しません。 –

+1

フォントのHFONTハンドルがあれば、私の[提案されたソリューション]を試すことができます(http://stackoverflow.com/questions/16769758/get-a-font-filename-based-on-the-font-handle- hfont)。あなたがそのフォントを扱っているかどうかの質問が不明なので、私はここに答えを加えたくありませんでした。 –

答えて

5

実際のファイルへのパスが必要な理由を聞かれますか?

  • フォントのバイナリデータが必要な場合は、GetFontDataを使用できます。
  • フォントのメトリックが必要な場合は、HFONTを作成し、フォントホルダHDCにHFONTを選択してGetOutlineTextMetricsを使用します。
  • フォントのリンクに関する情報が必要な場合は、私のプロジェクト:font_link.cppをご覧ください。
  • 上記はすべて純粋なGDI関数です。フォントパスが本当に必要でDirectWriteを気にしない場合は、IDWriteFontFile::GetReferenceKeyIDWriteLocalFontFileLoader::GetFilePathFromKeyを見てください。これにより、GDIよりも将来の保険が増えます。
7

「Arial Bold」またはそのような名前に基づいてフォントファイルを見つけるWindowsプラットフォーム用のコードを書きました。コードは以下に掲載されています。レジストリをスキャンし、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()); 
} 
関連する問題