声明:此方法只适用于windows系统

利用freetype的时候,需要传入字体的路径,找了半天找不到一个合适的方法,经指导研究,找到一种合适的方法,

贴出来共享。

#include<dwrite.h>
#pragma once dwrite.libvoid GetSystemFont(){std::map<std::wstring, std::wstring> m_systemFonts  ;m_systemFonts.clear();IDWriteFontCollection* pFontCollection = NULL;// Get the system font collection.HRESULT hr = S_OK;IDWriteFactory* pDWriteFactory = NULL;if (SUCCEEDED(hr)){hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,__uuidof(IDWriteFactory),reinterpret_cast<IUnknown**>(&pDWriteFactory));}// Get the system font collection.if (SUCCEEDED(hr)){hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection);}UINT32 familyCount = 0;// Get the number of font families in the collection.if (SUCCEEDED(hr)){familyCount = pFontCollection->GetFontFamilyCount();}for (UINT32 i = 0; i < familyCount; ++i) {IDWriteFontFamily* pFontFamily = NULL;// Get the font family.if (SUCCEEDED(hr)){IDWriteLocalizedStrings* pFamilyNames = NULL;hr = pFontCollection->GetFontFamily(i, &pFontFamily);// Get a list of localized strings for the family name.if (SUCCEEDED(hr)){hr = pFontFamily->GetFamilyNames(&pFamilyNames);}UINT32 index = 0;BOOL exists = false;if (!exists)index = 0;UINT32 length = 0;// Get the string length.if (SUCCEEDED(hr)){hr = pFamilyNames->GetStringLength(index, &length);}// Allocate a string big enough to hold the name.wchar_t* name = new wchar_t[length + 1];std::wstring sname;std::wstring sname_unicode;std::wstring fpath;// Get the family name.if (SUCCEEDED(hr)){hr = pFamilyNames->GetString(index, name, length + 1);//sname 为英文名sname = std::wstring(name);fpath = GetSystemFontFile(sname);if (fpath.empty()) {continue;}}wchar_t localeName[LOCALE_NAME_MAX_LENGTH];if (SUCCEEDED(hr)){// Get the default locale for this user.int defaultLocaleSuccess = GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH);//If the default locale is returned, find that locale name, otherwise use "en-us".if (defaultLocaleSuccess){hr = pFamilyNames->FindLocaleName(localeName, &index, &exists);}if (SUCCEEDED(hr) && !exists) // if the above find did not find a match, retry with US English{hr = pFamilyNames->FindLocaleName(L"en-us", &index, &exists);}}// If the specified locale doesn't exist, select the first on the list.if (!exists)index = 0;length = 0;// Get the string length.if (SUCCEEDED(hr)){hr = pFamilyNames->GetStringLength(index, &length);}// Get the family name.if (SUCCEEDED(hr)){hr = pFamilyNames->GetString(index, name, length + 1);//sname_unicode为对应的中文名sname_unicode = std::wstring(name);m_systemFonts[sname_unicode] = fpath;}delete[]name;if (pFontFamily){pFontFamily->Release();pFontFamily = NULL;}if (pFamilyNames){pFamilyNames->Release();pFamilyNames = NULL;}}}if (pFontCollection){pFontCollection->Release();pFontCollection = NULL;}if (pDWriteFactory){pDWriteFactory->Release();pDWriteFactory = NULL;}}}
std::wstring GetSystemFontFile(const std::wstring &faceName) {std::wstring wsFontFile;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 keyresult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, fontRegistryPath, 0, KEY_READ, &hKey);if (result != ERROR_SUCCESS) {return L"";}DWORD maxValueNameSize, maxValueDataSize;result = RegQueryInfoKey(hKey, 0, 0, 0, 0, 0, 0, 0, &maxValueNameSize, &maxValueDataSize, 0, 0);if (result != ERROR_SUCCESS) {return L"";}DWORD valueIndex = 0;LPWSTR valueName = new WCHAR[maxValueNameSize];LPBYTE valueData = new BYTE[maxValueDataSize];DWORD valueNameSize, valueDataSize, valueType;// Look for a matching font namedo {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 matchif (_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 L"";}// Build full font file pathWCHAR winDir[MAX_PATH];GetWindowsDirectory(winDir, MAX_PATH);std::wstringstream ss;ss << winDir << "\\Fonts\\" << wsFontFile;wsFontFile = ss.str();return wsFontFile;
}

根据字体的中文名 获取 字体的路径 和 英文名相关推荐

  1. elupload获取文件名与路径_Uipath获取文件名,路径,扩展名等操作

    Uipath获取文件名,路径,扩展名等操作 东京IT青年前线​www.rpatokyo.com 使用Assign Activity,声明一个字符串变量为str 获取文件路径代码 System.IO.P ...

  2. ubuntu中中文名新加卷修改为英文名新加卷

    1.刚装完ubuntu系统,盘符结构如下图,ubuntu系统在第一块ssd硬盘中(计算机),剩下的3个新加卷是一块机械硬盘,被分成了3个分区. 2.其中3个新加卷在系统中实际上被命名为:新加卷.新加卷 ...

  3. PyQt5 技术篇-调用字体对话框(QFontDialog)获取字体,控件设置字体。

    QFontDialog字体对话框 font, isok = QFontDialog.getFont() 返回值font是QFont字体对象,isok是True或False. 注:如果点了确定就是Tru ...

  4. 利用正则表达式获取豆瓣TOP250电影的英文名、港台名、导演、主演、上映年份、电影分类以及评分

    唐松编<python网络爬虫从入门到实践>第47页3.4.3自我实践题 全部代码为原创代码 完整代码如下: import requests import reheaders = {'Use ...

  5. Windows10电脑用户中文名修改为英文名的详细教程【亲测有用】

    Windows10电脑用户中文名修改为英文名详细教程[亲测有用] 1.控制面板修改电脑名 2.注册表修改电脑名 3.文件夹修改电脑名 1.控制面板修改电脑名 第一步:Windows10左下角搜索控制面 ...

  6. Cdn英文的读音音标_根据中文名取英文名2019

    取英文名的方式有很多,根据中文名取英文名就是其中的一种,也是人们最喜用的一种技巧.但对于英文名字的赋予还是有很多讲究的,所以今天Elvis老师在这里分享最新根据中文名取英文名2019,希望能帮助到大家 ...

  7. MFC从字体名获取字库文件路径(从宋体获取到simsun.ttc)

    上一篇有讲到在QT中从字体名获取文字的路径,这个是MFC版本的: #QT从字体名获取字库文件路径#include <string> using namespace std;void wch ...

  8. vue如何动态获取数据改变背景颜色和字体颜色以及获取图片

    vue如何动态获取数据改变背景颜色和字体颜色以及获取图片 首先要想获取多条数据要用到v-for循环,写到循环就必须写:key 话不多说上代码 重点就是:style="{background: ...

  9. C#实现根据字体名称获取字体文件名

      <简单测试.NET开源的PDF文档生成器QuestPDF>中提到,绘制文字时指定字体用的不是字体名称,而是字体文件名.之前学习C# GDI+.HTML5中的Canvas.Tkinter ...

最新文章

  1. 计算图像的标准差与方差(meanStdDev() 函数)
  2. “九头虫”病毒技术分析报告
  3. Linux学习之系统编程篇:mmap练习
  4. C# Task的简单使用
  5. TreeView中右击直接获取节点的方法
  6. laravel 5连接MySQL_Laravel 手记(连接mysql)
  7. Html 页面底部添加版权信息11
  8. H264/AVC-基本概念和码流结构
  9. 苹果x屏幕黑有包白苹果_苹果捆绑包的关键
  10. 【NOIP2016】bzoj4719 天天爱跑步
  11. Leetcode 1823 找出游戏的获胜者 (约瑟夫环问题)
  12. 美容院管理系统统一管理制度?
  13. 微软辟谣裁员1.1万人/ 「美版视觉中国」起诉AI侵权/ 马斯克收购推特首期利息将到期…今日更多新鲜事在此...
  14. 华为设备配置SSH远程登录
  15. PHP中的empty()函数
  16. GitHub 牛逼项目:用东北话来编程,就问你怕不怕!
  17. Day21 jQuery 基础二
  18. android rotate 动画,Android RotateAnimation详解
  19. STM32G070RBT6基于Arduino串口的使用
  20. 2021-2027全球及中国电外科手术钳行业研究及十四五规划分析报告

热门文章

  1. jupyter notebook(python)使用pycharts库实现动态地图展示
  2. 英文论文写作中的词汇句式总结
  3. 软件开发过程与项目管理(14.项目核心计划执行控制)
  4. 【实时渲染】实时渲染中的光与颜色
  5. Linux的基础存储管理
  6. 小程序-实现左右菜单联动功能
  7. C++ GUI Programming with Qt4 Second Edition 之 附录A.2 Windows系统Qt的安装
  8. 4种最适合零基础入门的编程语言排行榜
  9. 获取当天或某天的开盘价
  10. 移动开发技术——近场通信