如何选择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
之前,在内存中动态更改字体的字体名称。您必须制作资源数据的副本才能写入。