- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
根据我找到的所有示例,以下代码应该可以将字体从存储在我的可执行文件中的二进制资源加载到系统内存,但它不起作用。 "myfont"是资源文件中与 IDR_FONT 关联的 ttf 的名称。
DWORD Count ;
HRSRC Resource = FindResource(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_FONT),"BINARY") ;
DWORD Length = SizeofResource(GetModuleHandle(NULL),Resource) ;
HGLOBAL Address = LoadResource(GetModuleHandle(NULL),Resource) ;
HANDLE Handle = AddFontMemResourceEx(Address,Length,0,&Count) ;
if(Handle==0)
{
MessageBox(hWnd,"Font load failed", "Error",NULL);
}
LOGFONT logfont; //set window font
logfont.lfCharSet = DEFAULT_CHARSET;
logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logfont.lfEscapement = 0;
memcpy(logfont.lfFaceName, "myfont", LF_FACESIZE);
logfont.lfHeight = 14;
logfont.lfItalic = FALSE;
logfont.lfOrientation = 0;
logfont.lfOutPrecision = OUT_TT_PRECIS;
logfont.lfQuality = PROOF_QUALITY;
logfont.lfStrikeOut = FALSE;
logfont.lfUnderline = FALSE;
logfont.lfWeight = FW_DONTCARE;
hFont = CreateFontIndirect(&logfont);
知道我做错了什么吗?
最佳答案
您的代码有两个问题。
您没有检查任何 API 函数是否失败。您对 FindResource()
的调用很可能失败,因为 "BINARY"
不是 standard resource type .用户定义的资源应该使用 RCDATA
代替:
HRSRC Resource = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_FONT), RT_RCDATA);
或者 FONT
如果它是一个实际的标准 FONT
资源:
HRSRC Resource = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_FONT), RT_FONT);
不过,资源类型的实际名称取决于您用来将资源添加到可执行文件的 .RC 文件的内容。
另一个问题,更重要的是,您实际上并没有访问资源的原始数据,因此您可以将真实的字体数据传递给 AddFontMemResourceEx()
。为此,您需要使用 LockResource()
。
尝试更像这样的东西:
HANDLE AddResourceFont(LPCTSTR ResID, DWORD *Installed)
{
if (Installed) *Installed = 0;
HMODULE hMod = GetModuleHandle(NULL);
DWORD Count, ErrorCode;
HRSRC Resource = FindResource(hMod, ResID, RT_RCDATA); // or RT_FONT or whatever your actual resource type is
if (!Resource)
{
ErrorCode = GetLastError();
//...
return NULL;
}
DWORD Length = SizeofResource(hMod, Resource);
if ((Length == 0) && (GetLastError() != 0))
{
ErrorCode = GetLastError();
//...
return NULL;
}
HGLOBAL Address = LoadResource(hMod, Resource);
if (!Address)
{
ErrorCode = GetLastError();
//...
return NULL;
}
PVOID FontData = LockResource(Address);
if (!FontData)
{
ErrorCode = GetLastError();
//...
return NULL;
}
HANDLE Handle = AddFontMemResourceEx(FontData, Length, 0, &Count);
if (!Handle)
{
ErrorCode = GetLastError();
//...
return NULL;
}
if (Installed) *Installed = Count;
return Handle;
}
.
DWORD Count = 0;
HANDLE hFont = AddResourceFont(MAKEINTRESOURCE(IDR_FONT), &Count);
if (hFont)
{
//...
RemoveFontMemResourceEx(hFont);
}
关于c++ - AddFontMemResourceEx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15232801/
根据我找到的所有示例,以下代码应该可以将字体从存储在我的可执行文件中的二进制资源加载到系统内存,但它不起作用。 "myfont"是资源文件中与 IDR_FONT 关联的 ttf 的名称。 DW
我正在学习本教程 Here从资源加载字体。我已经包含了 Wingdi.h header source ,但我在编译时收到“::AddFontMemResourceEx' has not been de
我正在使用资源中包含的字体通过 C++ 在 Windows 上开发游戏应用程序。 我可以通过 AddFontMemResourceEx 和 CreateFont 加载字体。 而且,我可以在没有安装任何
在 WPF 中,我们希望将 ttf 字体用作嵌入式资源,而无需将它们复制或安装到系统中,也无需实际将它们写入磁盘。没有内存泄漏问题。 没有详述的解决方案: How to include externa
我是一名优秀的程序员,十分优秀!