ImGui 学习笔记(五) —— 字体文件加载问题

ops/2025/3/18 21:25:01/

ImGui 加载字体文件的函数似乎存在编码问题,这一点可能跟源文件的编码也有关系,我目前源文件编码是 UTF-16。

当参数中包含中文字符时,ImGui 内部将字符转换为宽字符字符集时候,采用的 MultiByteToWideChar API 参数不太对,应该改为 CP_ACP 才对,原本它使用的是 CP_UTF8。

函数位于 imgui.cpp :

ImFileHandle ImFileOpen(const char* filename, const char* mode)
{
#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && (defined(__MINGW32__) || (!defined(__CYGWIN__) && !defined(__GNUC__)))// We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames.// Previously we used ImTextCountCharsFromUtf8/ImTextStrFromUtf8 here but we now need to support ImWchar16 and ImWchar32!const int filename_wsize = ::MultiByteToWideChar(CP_ACP, 0, filename, -1, NULL, 0);const int mode_wsize = ::MultiByteToWideChar(CP_ACP, 0, mode, -1, NULL, 0);// Use stack buffer if possible, otherwise heap buffer. Sizes include zero terminator.// We don't rely on current ImGuiContext as this is implied to be a helper function which doesn't depend on it (see #7314).wchar_t local_temp_stack[FILENAME_MAX];ImVector<wchar_t> local_temp_heap;if (filename_wsize + mode_wsize > IM_ARRAYSIZE(local_temp_stack))local_temp_heap.resize(filename_wsize + mode_wsize);wchar_t* filename_wbuf = local_temp_heap.Data ? local_temp_heap.Data : local_temp_stack;wchar_t* mode_wbuf = filename_wbuf + filename_wsize;::MultiByteToWideChar(CP_ACP, 0, filename, -1, filename_wbuf, filename_wsize);::MultiByteToWideChar(CP_ACP, 0, mode, -1, mode_wbuf, mode_wsize);DBGPRINT(L"FileOpen Path: %s", filename_wbuf);return ::_wfopen(filename_wbuf, mode_wbuf);
#elsereturn fopen(filename, mode);
#endif

修改前,字体加载失败,然后我发现它处理相对路径的方式也不好。改用完整路径后也还是一样失败:

输出更多信息看看:
 

明显路径中中文编码出现了乱码 ?????。

按照上面方法修改后,你可能会在 Read 失败。继续看,发现这里可能有问题:
void*   ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size, int padding_bytes)

找到 ImFileRead(file_data, 1, file_size, f) 他直接写在条件里面的,我们把他改成两步:

size_t ret_size = ImFileRead(file_data, 1, file_size, f);
if (ret_size != file_size)
{ImFileClose(f);IM_FREE(file_data);return NULL;
}

最后,再次尝试:
 

绝对路径(加载字体文件)已经没有问题了;如果用相对路径则还有问题,并且可能与访问权限有关系。

我注入的程序在 C:\Windows\ 下,这里创建 imgui.ini 默认的配置文件失败。这个好解决,在加载函数前面加上一些路径检查和转换的代码,比如转为绝对路径(程序目录+文件名),然后检查权限,权限不够就改用 COM 或者提权(我这里不考虑跨平台,所以没关系,如果考虑跨平台,可能需要更多修改)。

文章来源:https://blog.csdn.net/qq_59075481/article/details/146322138
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/ops/166872.html

相关文章

Java 的 CopyOnWriteArrayList 和 Collections.synchronizedList 有什么区别?分别有什么优缺点?

CopyOnWriteArrayList 问题:什么是 CopyOnWriteArrayList? 解答: CopyOnWriteArrayList 是 Java 并发包 (java.util.concurrent) 提供的一种 线程安全 的 List 实现,它的核心特性是 写时复制(Copy-On-Write)。即,每当执行修改操作(如 add()、set()、remove())时,都…

CSS中z-index使用详情

定位层级 1.定位元素的显示层级比普通元素高,无论什么定位,显示层级都是一样的; 2.如果位置发生重叠,默认情况是:后面的元素,会显示在前面元素之上; 3.可以通过CSS属性z-index调整元素的显示层级; 4.z-index的属性值是数字,没有单位,值越大显示层级越高; 5.只有定位的元素…

上下文微调(Contextual Fine-Tuning, CFT)提高大型语言模型(LLMs)在特定领域的学习和推理能力

大型语言模型(LLMs)在开放领域任务中表现出色,但在快速演变的专业领域(如医学、金融)中面临挑战: 知识更新难题:传统指令微调(Instruction Fine-Tuning, IFT)依赖显式指令,难以适应动态知识。灾难性遗忘:持续预训练(Continued Pretraining, CPT)可能导致模型遗忘已…

WPF未来展望:紧跟技术发展趋势,探索新的可能性

WPF未来展望&#xff1a;紧跟技术发展趋势&#xff0c;探索新的可能性 一、前言二、WPF 与.NET 技术的融合发展2.1 拥抱.NET Core2.2 利用.NET 5 及后续版本的新特性 三、WPF 在新兴技术领域的应用拓展3.1 与云计算的结合3.2 融入物联网生态 四、WPF 在用户体验和设计方面的创新…

密码学研究热点

一、后量子密码学 抗量子算法研究 开发能够抵抗量子计算机攻击的加密算法&#xff0c;如基于格的密码学&#xff08;LWE、NTRU&#xff09;、基于同源的密码学&#xff08;Isogeny&#xff09;和基于编码理论的密码学。 标准化进程 NIST等机构正推动后量子密码算法的标准化…

审批工作流系统xFlow

WorkFlow-审批流程系统 该项目为完全开源免费项目 可用于学习或搭建初始化审批流程系统 希望有用的小伙伴记得点个免费的star gitee仓库地址 仿钉钉飞书工作审批流系统 介绍 前端技术栈: vue3 ts vite arcodesign eslint 后端技术栈:springbootspring mvc mybatis mavenmysq…

android.widget包介绍

android.widget 是 Android 开发中用于构建用户界面&#xff08;UI&#xff09;的核心包之一。它包含了大量的 UI 控件&#xff08;如按钮、文本框、列表等&#xff09;&#xff0c;这些控件通常被称为“小部件”&#xff08;Widget&#xff09;。android.widget 包中的类大多继…

windows协议不再续签,华为再无windows可用,将于四月发布鸿蒙PC

大家好&#xff0c;我是国货系创始人张云泽&#xff0c;最近不少小伙伴在后台问&#xff1a;“听说Windows协议要到期了&#xff1f;我的电脑会不会变砖&#xff1f;”还有人说&#xff1a;“华为笔记本以后用不了Windows了&#xff1f;鸿蒙系统能用吗&#xff1f;”今天咱们就…