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

相关文章

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、