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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-calendar自定义日程,显示文字内容,el-date-picker和el-calendar互动互联

Vue实现 el-calendar自定义日程,显示文字内容,el-date-picker和el-calendar互动互联 效果展示 首先el-calendar需要自定义日程内容的话,其格式一般必须满足如下结构 dataList = [{date: 2024-05-08, content: "数学模拟试卷(3)"},{date: 2024-05-08, content: …

【STM32 |程序实例】按键控制、光敏传感器控制蜂鸣器

目录 前言 按键控制LED 光敏传感器控制蜂鸣器 前言 上拉输入&#xff1a;若GPIO引脚配置为上拉输入模式&#xff0c;在默认情况下&#xff08;GPIO引脚无输入&#xff09;&#xff0c;读取的GPIO引脚数据为1&#xff0c;即高电平。 下拉输入&#xff1a;若GPIO引脚配置为下…

C语言(指针)6

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

深度学习之神经网络理论基础

深度学习之神经网络理论基础 人工神经元 人工神经元&#xff1a;人类神经元中抽象出来的数学模型 MP模型 mp模型&#xff1a;1943年心理学家W.S.McCulloch和数理逻辑学家W.Pitts研究出人工神经元&#xff0c;称为M-P模型。 M-P神经元&#xff08;一个用来模拟生物行为的数学模…

.NET开源、功能强大、跨平台的图表库LiveChart2

LiveCharts2 是 从LiveCharts演变而来,它修复了其前身的主要设计问题,它专注于在任何地方运行,提高了灵活性,并继承LiveCharts原有功能。 极其灵活的数据展示图库 (效果图) 开始使用 Live charts 是 .Net 的跨平台图表库,请访问 https://livecharts.dev 并查看目标平…

React 基础案例

React的特点&#xff1a; 1、声明式编程 2、组件化开发 3、多平台适配yuan 原生实现&#xff1a; <h2 class"title"></h2><button class"btn">改变文本</button><script>let msg "Hello World";const titleEl d…

P6397 [COI2008] GLASNICI

题目描述 一条直线上有 &#x1d45b; 个信使&#xff0c;将他们按照从左至右的顺序以 1 至 &#x1d45b; 编号。换句话说&#xff0c;设 &#x1d456; 号信使的的坐标为 &#x1d451;&#x1d456;​&#xff0c;则对于 1≤&#x1d456;<&#x1d45b;&#xff0c; &am…

TCP协议建立连接的过程及其意义

目录 三次握手 四次挥手 三次握手的意义 在客户端与服务器传输数据之前&#xff0c;要在两台主机之间先建立连接&#xff0c;然后再传输业务数据。三次握手&#xff0c;就是建立连接的过程&#xff0c;是在传输业务之前&#xff0c;就要先进行。握手好了&#xff0c;才能进行…

【新手入门】Github与Git使用教程

Github与Git 一、Github基础教程 1.1 基本操作 点击代码文件可以直接查看文件的内容&#xff0c;支持在线修改文件&#xff0c;只需要点击(文件内容)右上角的编辑按钮即可进行编辑。 README.md一般介绍项目的功能&#xff0c;用法&#xff0c;注意事项&#xff1b;有时还有…

LeetCode //C - 93. Restore IP Addresses

93. Restore IP Addresses A valid IP address consists of exactly four integers separated by single dots. Each integer is between 0 and 255 (inclusive) and cannot have leading zeros. For example, “0.1.2.201” and “192.168.1.1” are valid IP addresses, bu…

虚拟机有线已连接但无法上网—·可能性之一

背景 VMware虚拟机&#xff0c;搭建了三台Linux服务器&#xff0c;组成Hadoop集群&#xff0c;由于在Hadoop102上有一些经常与Mysql数据库交互的任务&#xff0c;需要经常打开运行&#xff0c;而Hadoop103和104则经常处于关闭状态&#xff0c;一段时间后再次启动集群时候&…

ES6 笔记03

01 回调地狱 回调地狱: 回调函数嵌套回调函数 嵌套过深导致维护不方便 02 promise语法的基本使用 promise语法的基本使用: 1.new Promise 对象 并接收新对象 2.在构造函数里面传入回调函数 3.回调函数里面有两个形参: resolve reject resolve 表示积极状态 reject 表示消极状…

Springboot整合 Spring Cloud Gateway

1.Gateway介绍 1.是spring cloud官方推出的响应式的API网关框架&#xff0c;旨在为微服务架构提供一种简单有效的API路由的管理方式&#xff0c;并基于Filter的方式提供网关的基本功能&#xff0c;例如&#xff1a;安全认证&#xff0c;监控&#xff0c;限流等等。 2.功能特征…

【逆天OP懒狗的JAVA自学笔记--5.判断和循环】第二阶段始篇

文章目录 前言一、流程控制语句1.顺序结构&#xff08;最简单&#xff09;2.分支结构2.1 if 语句2.1.1 if语句的三种格式2.1.2 if 的注意事项 2.2 switch 语句2.2.1switch 的扩展知识 3.循环结构3.1 for 循环 扩展小点&#xff1a;//1.求和的变量不能定义在循环的里面&#xff…

php全局变量

PHP 全局变量 PHP中预定义了几个超级全局变量&#xff08;superglobals&#xff09; &#xff0c;这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明&#xff0c;就可以在函数及类中使用。 PHP 超级全局变量列表: $GLOBALS$_SERVER$_REQUEST$_POST$_GET$_FILE…

解决finalshell无法连接,一直提示登陆密码

问题描述 在使用FinalShell连接配置虚拟机时&#xff0c;无法正常连接&#xff0c;一直提示输入登录密码&#xff0c;即使输入的密码是正确的。 切换到root 模式,输入密码 su root 此时需要输入root账户的密码&#xff0c;但是我们又不知道root的密码&#xff0c;怎么办&…

嵌入式STM32中I2C控制器外设详解

STM32中的I2C外设主要负责IIC协议与外界进行通信,就像USART外设一样,我们在学习的过程中,需要抓住I2C应用的重点。 STM32在使用I2C协议时,可以通过两种方式, 一是软件模拟协议 意思是使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑。例如,像点亮LED那样…

大数据模型的选择与安装

大数据模型的选择和安装是一个复杂的过程&#xff0c;涉及多个因素&#xff0c;包括模型的通用能力、特定任务的性能、数据效率、评估完整性、成本以及部署的硬件和软件环境。以下是一些关于大数据模型选择与安装的考虑因素和步骤&#xff1a; 选择大数据模型的考虑因素&#…

VUE基础之scoped和TodList

目录 scoped样式 总结TodoList案例 scoped样式 作用&#xff1a;让样式在局部生效&#xff0c;防止冲突。 写法&#xff1a;<style scoped> <style scoped> .demo{background-color: pink; } </style> 注&#xff1a;如果在APP.vue中写style代码则是所有组…

绝地求生:经典艾伦格即将回归!绝地求生艾伦格进化史

29.2版本经典艾伦格地图将会回归&#xff0c;让我回顾一下艾伦格地图的改动历史吧&#xff01; 回归时间 2016年早期A测 A测 4.1版本&#xff1a;艾伦格-新视界 主要区域变动 Military Base(军事基地) Military Base Mylta Power&#xff08;大电&#xff09; Mylta Power …