2012-07-08 23 views
5

Tôi hiện đang triển khai FreeType 2 trong một dự án của tôi và do đó cần các filepaths cho Phông chữ trên hệ thống của tôi. Tôi cần một giải pháp chỉ lấy tên phông chữ và kiểu phông chữ mong muốn (ví dụ: đậm hoặc nghiêng) và sau đó trả về filepath cho phông chữ.Lấy một filepath phông chữ từ tên và kiểu trong C++/Windows

Tôi đã thử câu trả lời từ Stack Overflow question, nhưng nó không hoạt động trên Windows 7 (và có lẽ không phải trên Vista), nhưng rõ ràng là tôi cần một giải pháp hoạt động trên các hệ thống này và các hệ thống tương lai.

+0

Không có api nào như vậy, giống như câu trả lời được liên kết cho biết. –

+1

Nếu bạn có tay cầm HFONT của phông chữ, bạn có thể thử [giải pháp được đề xuất] của tôi (http://stackoverflow.com/questions/16769758/get-a-font-filename-based-on-the-font-handle- hfont). Tôi không muốn thêm câu trả lời ở đây, bởi vì câu hỏi là không rõ ràng nếu bạn có một xử lý cho phông chữ hay không. –

Trả lời

5

Tôi có thể hỏi tại sao bạn cần đường dẫn đến tệp vật lý?

  • Nếu bạn chỉ cần dữ liệu nhị phân của phông chữ, bạn có thể sử dụng GetFontData.
  • Nếu cần chỉ số của phông chữ, bạn có thể tạo một HFONT, chọn HFONT vào một chủ phông HDC và sử dụng GetOutlineTextMetrics.
  • Nếu bạn cần thông tin về liên kết phông chữ, hãy xem dự án của tôi: font_link.cpp.
  • Tất cả ở trên là các hàm GDI thuần túy. Nếu bạn thực sự cần đường dẫn phông chữ và không nhớ sử dụng DirectWrite, hãy xem IDWriteFontFile::GetReferenceKeyIDWriteLocalFontFileLoader::GetFilePathFromKey. Điều này sẽ cung cấp cho bạn bảo hiểm trong tương lai nhiều hơn GDI.
7

Tôi đã từng viết mã cho nền tảng Windows để tìm tệp phông chữ dựa trên "Arial Bold" hoặc tên như vậy. Mã được đăng bên dưới. Nó đang quét Registry và cố gắng tìm một kết quả phù hợp cho tên phông chữ cho một tập tin trong thư mục phông chữ của Windows. Nó có thể không chống đạn, nhưng nó hoạt động tốt. Khi bạn có tên tệp, bạn có thể chuyển nó sang 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 vấn đề liên quan