【问题标题】:Get a font filepath from name and style in C++/Windows从 C++/Windows 中的名称和样式获取字体文件路径
【发布时间】:2012-07-08 09:49:44
【问题描述】:

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

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

【问题讨论】:

  • 不存在这样的 api,就像链接的答案所说的那样。
  • 如果你有字体的HFONT句柄,你可以试试我的proposed solution。我不想在这里添加答案,因为问题不清楚您是否有字体句柄。

标签: c++ windows fonts freetype


【解决方案1】:

我曾经为 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());
}

【讨论】:

    【解决方案2】:

    请问为什么需要物理文件的路径?

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2019-09-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 2011-11-16
      相关资源
      最近更新 更多