MFC/QT利用COM组件接口从字体名称、粗体、斜体获取到字体文件路径的方法

2024-05-14 05:44

本文主要是介绍MFC/QT利用COM组件接口从字体名称、粗体、斜体获取到字体文件路径的方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MFC/QT利用COM组件接口从字体名称、粗体、斜体获取到字体文件路径的方法

这个是目前唯一能准确从字体名称+加粗+斜体三个属性定位到ttf/ttc字体路径的方法,其他的方式是没有办法区分后两个属性而且会出现不准确的问题

之前无意间在MSDN找到的资料:

IDWriteLocalFontFileLoader::GetFilePathFromKey (dwrite.h) - Win32 apps | Microsoft Learn

#include <iostream>
#include <dwrite.h>
#include <list>
#pragma comment(lib, "dwrite.lib")using namespace std;list<WCHAR*> get_fonts_path(WCHAR* family_name, BOOL is_bold, BOOL is_italic)
{list<WCHAR*> fonts_filename_list;HRESULT hr;IDWriteFactory* dwrite_factory;hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_ISOLATED, __uuidof(IDWriteFactory), reinterpret_cast<IUnknown**>(&dwrite_factory));if (FAILED(hr)){return fonts_filename_list;}IDWriteGdiInterop* gdi_interop;hr = dwrite_factory->GetGdiInterop(&gdi_interop);if (FAILED(hr)){dwrite_factory->Release();return fonts_filename_list;}LOGFONT lf;memset(&lf, 0, sizeof(lf));wcscpy_s(lf.lfFaceName, LF_FACESIZE, family_name);lf.lfWeight = is_bold ? FW_BOLD : FW_REGULAR;lf.lfItalic = is_italic;lf.lfCharSet = DEFAULT_CHARSET;lf.lfOutPrecision = OUT_TT_PRECIS;lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;lf.lfQuality = ANTIALIASED_QUALITY;lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;IDWriteFont* matching_font;hr = gdi_interop->CreateFontFromLOGFONT(&lf, &matching_font);if (FAILED(hr)){gdi_interop->Release();dwrite_factory->Release();return fonts_filename_list;}IDWriteFontFace* font_face;hr = matching_font->CreateFontFace(&font_face);if (FAILED(hr)){matching_font->Release();gdi_interop->Release();dwrite_factory->Release();return fonts_filename_list;}UINT file_count;hr = font_face->GetFiles(&file_count, NULL);if (FAILED(hr)){font_face->Release();matching_font->Release();gdi_interop->Release();dwrite_factory->Release();return fonts_filename_list;}IDWriteFontFile** font_files = new IDWriteFontFile * [file_count];hr = font_face->GetFiles(&file_count, font_files);if (FAILED(hr)){font_face->Release();matching_font->Release();gdi_interop->Release();dwrite_factory->Release();return fonts_filename_list;}for (int i = 0; i < file_count; i++){LPCVOID font_file_reference_key;UINT font_file_reference_key_size;hr = font_files[i]->GetReferenceKey(&font_file_reference_key, &font_file_reference_key_size);if (FAILED(hr)){font_files[i]->Release();continue;}IDWriteFontFileLoader* loader;hr = font_files[i]->GetLoader(&loader);if (FAILED(hr)){font_files[i]->Release();continue;}IDWriteLocalFontFileLoader* local_loader;hr = loader->QueryInterface(__uuidof(IDWriteLocalFontFileLoader), (void**)&local_loader);if (FAILED(hr)){loader->Release();font_files[i]->Release();continue;}UINT32 path_length;hr = local_loader->GetFilePathLengthFromKey(font_file_reference_key, font_file_reference_key_size, &path_length);if (FAILED(hr)){local_loader->Release();loader->Release();font_files[i]->Release();continue;}WCHAR* path = new WCHAR[path_length + 1];hr = local_loader->GetFilePathFromKey(font_file_reference_key, font_file_reference_key_size, path, path_length + 1);if (FAILED(hr)){local_loader->Release();loader->Release();font_files[i]->Release();continue;}fonts_filename_list.push_back(path);local_loader->Release();loader->Release();font_files[i]->Release();}font_face->Release();matching_font->Release();gdi_interop->Release();dwrite_factory->Release();return fonts_filename_list;
}int main() {list<WCHAR*> fonts_filename_list = get_fonts_path(const_cast<WCHAR*>(L"Arial"), false, true);for (WCHAR* font_filename : fonts_filename_list){wcout << L"Font filename: " << font_filename << endl;}return 0;
}

这篇关于MFC/QT利用COM组件接口从字体名称、粗体、斜体获取到字体文件路径的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987900

相关文章

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶