Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何选择AddFontMemResourceEx加载的字体而不是system? 我用C++开发了Windows上的游戏应用程序,其中包含了资源。_C++_Winapi - Fatal编程技术网

如何选择AddFontMemResourceEx加载的字体而不是system? 我用C++开发了Windows上的游戏应用程序,其中包含了资源。

如何选择AddFontMemResourceEx加载的字体而不是system? 我用C++开发了Windows上的游戏应用程序,其中包含了资源。,c++,winapi,C++,Winapi,我可以通过AddFontMemResourceEx和CreateFont加载字体 而且,我可以在不安装任何特殊字体的环境中正确呈现加载字体的文本 但是,世界上存在几种版本的字体。 如果系统中已经安装了其他版本,CreateFont将通过字体名称(pszFaceName)查找字体,并且不方便地选择系统字体。 是否有人更喜欢由AddFontMemResourceEx加载的私有字体 仅供参考,AddFontMemResourceEx的返回值为HANDLE,但我找不到任何用于CreateFont的代码

我可以通过
AddFontMemResourceEx
CreateFont
加载字体
而且,我可以在不安装任何特殊字体的环境中正确呈现加载字体的文本

但是,世界上存在几种版本的字体。
如果系统中已经安装了其他版本,
CreateFont
将通过字体名称(
pszFaceName
)查找字体,并且不方便地选择系统字体。
是否有人更喜欢由
AddFontMemResourceEx
加载的私有字体

仅供参考,
AddFontMemResourceEx
的返回值为
HANDLE
,但我找不到任何用于
CreateFont
的代码
也许,在私有字体上编辑字体族可以避免冲突。 但是,如果可以的话,我想通过编程来解决这个问题

HANDLE HANDLE=AddFontMemResourceEx(数据、readBytes、NULL和&fontNum);
hFont=CreateFont(24,0,0,0,FW_正常,FALSE,FALSE,FALSE,SHIFTJIS_字符集,OUT_TT_ONLY_PRECIS,
剪辑(默认)(精确),校对(质量),默认(音高)(FF)DONTCARE,L"UmePlus CL Gothic);;

谢谢您的评论
我已经根据注释替换了内存中的字体名称

但是,由于endian的不同,该代码有点复杂

注意:
newFontName
必须短于
oldFontName

#pragma包(1)
类型定义结构{
短版本;
长长的珠子;
短搜索距离;
短入口选择器;
短程移;
}TTF_头;
类型定义结构{
字符名[4];
长校验和;
长偏移量;
长度长;
}TTF_偏移量_表;
类型定义结构{
短格式;
短计数;
短偏移量;
}TTF_名称_表格_标题;
类型定义结构{
短板形;
短特异性ID;
短类语言;
短nameId;
短长度;
短偏移量;
}TTF_NAME_TABLE_条目;
#pragma pack()
void copySwappedWchar(常量wchar\u t*src、wchar\u t*dest、int-length){
for(int i=0;inumTables);i++){
TTF_OFFSET_TABLE*TABLE=(TTF_OFFSET_TABLE*)(offsetTableBase+sizeof(TTF_OFFSET_TABLE)*i);
如果(memcmp(表->名称,“名称”,4)!=0)继续;
TTF_NAME_TABLE_HEADER*nameTable=(TTF_NAME_TABLE_HEADER*)(数据+_byteswap_ulong(表->偏移量));
unsigned char*entryBase=data+\u byteswap\u ulong(table->offset)+sizeof(TTF\u NAME\u table\u HEADER);
对于(int j=0;j<\u byteswap\u ushort(名称表->计数);j++){
TTF_NAME_TABLE_ENTRY*ENTRY=(TTF_NAME_TABLE_ENTRY*)(entryBase+sizeof(TTF_NAME_TABLE_ENTRY)*j);
wchar_t*dest=新的wchar_t[_byteswap_ushort(条目->长度)+1];
wchar_t*src=(wchar_t*)(数据+\u byteswap_ulong(表格->偏移量)+\u byteswap_ushort(名称表格->字符串偏移量)+\u byteswap_ushort(条目->偏移量));
copySwappedWchar((const wchar_t*)src,dest,_byteswap_ushort(条目->长度)+1;
如果(wcscmp(dest,oldFontName)==0){
copySwappedWchar(newFontName、src、wcslen(newFontName)+1);
}
}
}
}

AddFontMemResourceEx()
返回的
句柄
唯一可用于的是
RemoveFontMemResourceEx()
与可能安装的其他字体相比,没有办法(据我所知)更喜欢内存字体。系统中只有一个字体表,
CreateFont(Indirect)(
为您指定的特征加载最合适的字体。如果另一种字体比您的内存字体更匹配,那么就这样吧。您可以在调用
AddFontMemResourceEx
之前,在内存中动态更改字体的字体名称。您必须制作资源数据的副本才能写入。