Winapi 在Win32上从字节数组创建字体资源

Winapi 在Win32上从字节数组创建字体资源,winapi,Winapi,我有一个字节数组,其中包含读入字体文件的内容。我希望WinAPI(没有Gdi+)从中创建一个字体资源,这样我就可以使用它来呈现文本 我只知道,从文件中加载字体资源,这听起来像我需要的,但在我看来,它仍然是一些资源系统的东西,数据必须与程序预先关联 我是否可以将加载的字节数组转换为字体资源?(可能不需要将其写入文件,然后调用AddFontResourceExW)当您将字体从资源脚本加载到内存中时,您可以使用如下代码(您没有添加语言标记,因此我使用的是C/C++代码-如果有问题,请告诉我): han

我有一个字节数组,其中包含读入字体文件的内容。我希望WinAPI(没有Gdi+)从中创建一个字体资源,这样我就可以使用它来呈现文本

我只知道,从文件中加载字体资源,这听起来像我需要的,但在我看来,它仍然是一些资源系统的东西,数据必须与程序预先关联


我是否可以将加载的字节数组转换为字体资源?(可能不需要将其写入文件,然后调用
AddFontResourceExW

当您将字体从资源脚本加载到内存中时,您可以使用如下代码(您没有添加语言标记,因此我使用的是C/C++代码-如果有问题,请告诉我):

handleh\u myfont=无效的\u HANDLE\u值;
HINSTANCE hResInstance=::GetModuleHandle(nullptr);
HRSRC ares=FindResource(hResInstance,MAKEINTRESOURCE(IDF_MYID),L“二进制”);
如果(战神){
HGLOBAL amem=负载资源(hResInstance,ares);
如果(amem!=nullptr){
void*adata=LockResource(amem);
DWORD nFonts=0,len=SizeofResource(hResInstance,ares);
H_myfont=AddFontMemResourceEx(adata、len、nullptr和nFonts);
}
}
这里的关键行是
void*adata=LockResource(amem)
-这将作为
HGLOBAL
加载的字体资源转换为“可访问内存”()。现在,假设字节数组的格式正确(见下文),您可以在调用
AddFontMemResourceEx
时传递一个指向它的指针(如
void*
)。(您可以使用已知数组大小来代替调用
SizeofResource

我建议编写如下代码:

void*my\u font\u data=(void*)(font\u字节\u数组);//您的字节数组数据
DWORD nFonts=0,len=sizeof(字体字节数组);
H_myfont=AddFontMemResourceEx(我的数据、len、nullptr和nFonts);
这(希望)将给你一个加载和可用的字体资源

当您使用完字体(一旦加载,就可以像任何系统安装的字体一样使用)后,您可以通过以下方式释放它:

RemoveFontMemResourceEx(H_myfont);
由于我没有你的字节数组,我无法(显然)测试这个想法。但是,如果您确实尝试过,请让我们知道它是否有效。(如果没有,可能还需要添加其他一些相对简单的步骤。)

注意:虽然我不能百分之百地说“字体资源”的确切格式是什么,但上面给出的代码(对我来说)与.rc脚本中定义为
二进制
的资源以及正常的“.ttf”文件一起工作的事实表明,如果您的字节数组遵循Windows字体文件的格式,那么它应该可以工作。这就是我将字体作为嵌入式资源的方式:

IDF_MYFONT  BINARY  L"..\\Resource\\MyFont.ttf"

保存到一个临时文件并添加它谢谢,它工作得很好!还有一个问题,因为我从未使用过WinAPI的这一部分:有没有一种方法可以从加载的字体资源中提取所有字体面(或字体名称)?当我用
CreateFontW
创建字体时,我可能不知道字体的名称,所以默认设置会更好(从文件中,而不是从系统中)。@PeterLenkefi我需要考虑一下——我会的!(同时,让我们整理一下前面的所有评论。)