C++ 尝试从资源加载字体时,FindResource返回NULL
我正在尝试从我的资源中加载字体。这是我使用的调用,当前返回NULL,因此失败:C++ 尝试从资源加载字体时,FindResource返回NULL,c++,winapi,embedded-resource,C++,Winapi,Embedded Resource,我正在尝试从我的资源中加载字体。这是我使用的调用,当前返回NULL,因此失败: HRSRC rsrcData = FindResource(NULL, MAKEINTRESOURCE(IDF_ROBOTBLACK), L"FONT"); 我已将字体资源添加到我的resource.rc文件中,该文件现在列出了以下内容: ///////////////////////////////////////////////////////////////////////////// // // Font
HRSRC rsrcData = FindResource(NULL, MAKEINTRESOURCE(IDF_ROBOTBLACK), L"FONT");
我已将字体资源添加到我的resource.rc文件中,该文件现在列出了以下内容:
/////////////////////////////////////////////////////////////////////////////
//
// Font
//
IDF_ROBOTBLACK FONT "Resources\\Fonts\\Roboto\\Roboto-Black.ttf"
此外,这就是我的Resource.h的外观:
#define IDF_ROBOTBLACK 108
据我所知,这应该是整个过程的全部内容
我已经成功地加载了另一种资源格式“PNG”,它也是作为一种新的自定义资源类型添加的,遵循相同的过程,同时只在到期时将“字体”替换为“PNG”
然而,与我的“PNG”加载方法相比,“字体”永远找不到。无论发生什么情况,FindResource都返回NULL
GetLastError()返回的错误代码是1813
我担心的是,ttf根本不受支持。我以前在解决方案资源中添加了各种格式,如.exe和.png、.jpg,但在添加资源时,文件选择器中甚至不建议使用.ttf
它不应该以这种方式存储吗?在findResource之后,您在哪里加载资源
if (rsrcData)
{
HGLOBAL hGlob = NULL;
if (HGLOBAL hGlob = LoadResource(inj_hModule, rsrcData))
{
DWORD dwResSize = SizeofResource(inj_hModule, rsrcData);
std::cout << "Ressource Found size 0x" << std::hex << dwResSize << std::endl;
LPVOID pRes = LockResource(hGlob);
std::cout << "Ressource Found at 0x" << std::hex << pRes << std::endl; ...
SendMessage(hWnd, WM_FONTCHANGE, 0, 0);
virtual void ResetFontCaches() = 0;
FONT
是一种,不同于PNG
。因此,您必须使用RT\u FONT
而不是L“FONT”
static void GetFont(HMODULE module, LPCSTR resource, std::string name) {
if (exists(path(name))) return;
HGLOBAL res_handle = NULL;
HRSRC res;
char * res_data;
DWORD res_size;
// We miss error handling on most of them - be careful!
res = FindResource(module, resource, RT_RCDATA);
if (!res) return;
res_handle = LoadResource(module, res);
if (!res_handle) return;
res_data = (char*)LockResource(res_handle);
res_size = SizeofResource(module, res);
std::ofstream stream;
stream.open(name, std::ios::binary);
stream.write(res_data, res_size);
stream.close();
AddFontResource(name.c_str());
}
资源声明可以保留为:
IDF_ROBOTBLACK FONT "filename.ttf"
然后必须按如下方式定位资源:
FindResource(NULL, MAKEINTRESOURCE(IDF_ROBOTBLACK), RT_FONT);
或者,您可以使用:
IDF_ROBOTBLACK xfont "filename.ttf"
这是因为xfont
不是标准资源(与PNG
相同)
或者,您可以始终使用
RCDATA
和RT\u RCDATA
我正按照你在代码中描述的方式来做。然而,之后发生什么并不重要,因为LoadResource会在rsrcData被删除的情况下失败NULL@Sossenbinder我只是添加了一个函数来完成这项工作,它为我运行;)对于下一个,请注意。您也可以使用AddFontMemResourceEx
,而不是从资源中读取并保存到磁盘。
IDF_ROBOTBLACK xfont "filename.ttf"
FindResource(NULL, MAKEINTRESOURCE(IDF_ROBOTBLACK), L"xfont");