尝试从资源加载字体时 FindResource returns NULL
FindResource returns NULL when trying to load a font from resources
我正在尝试从我的资源中加载字体。这是我使用的调用,当前 returns NULL 因此失败:
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",它也是作为新的自定义资源类型添加的,遵循相同的过程,只是将 "FONT" 替换为 [=32] =] 到期的地方。
但是,与我的 "PNG" 加载方法相比,从未找到 "FONT"。 FindResource returns 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; ...
这是一项测试,用于了解内存的位置以及字体大小。
1。在此步骤中:一个小功能 运行 并经过测试。问候,尝试将所有资源字体添加到您的项目中。
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());
}
- 将它们添加到注册表(您需要禁用 UAC 或请求用户许可)
你可以看看
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts to see how to do it.
加载完所有字体后,您可以广播更改
SendMessage(hWnd, WM_FONTCHANGE, 0, 0);
在ISurface中调用此函数
virtual void ResetFontCaches() = 0;
测试和 gl :)
Interfaces::Surface()->SetFontGlyphSet(font, XorStr("Open Sans Bold"), 22, 300, 0, 0, FONT_CREATE_ANTIALIASED);
您要适应您的上下文渲染,问候。
FONT
是 standard resource type,与 PNG
不同。因此,您必须使用 RT_FONT
而不是 L"FONT"
。
资源声明可以保留为:
IDF_ROBOTBLACK FONT "filename.ttf"
资源必须位于如下位置:
FindResource(NULL, MAKEINTRESOURCE(IDF_ROBOTBLACK), RT_FONT);
或者,您可以使用:
IDF_ROBOTBLACK xfont "filename.ttf"
FindResource(NULL, MAKEINTRESOURCE(IDF_ROBOTBLACK), L"xfont");
这可行,因为 xfont
不是标准资源(与 PNG
相同)。
或者,您始终可以使用 RCDATA
和 RT_RCDATA
。
我正在尝试从我的资源中加载字体。这是我使用的调用,当前 returns NULL 因此失败:
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",它也是作为新的自定义资源类型添加的,遵循相同的过程,只是将 "FONT" 替换为 [=32] =] 到期的地方。
但是,与我的 "PNG" 加载方法相比,从未找到 "FONT"。 FindResource returns 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; ...
这是一项测试,用于了解内存的位置以及字体大小。
1。在此步骤中:一个小功能 运行 并经过测试。问候,尝试将所有资源字体添加到您的项目中。
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());
}
- 将它们添加到注册表(您需要禁用 UAC 或请求用户许可)
你可以看看
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts to see how to do it.
加载完所有字体后,您可以广播更改
SendMessage(hWnd, WM_FONTCHANGE, 0, 0);
在ISurface中调用此函数
virtual void ResetFontCaches() = 0;
测试和 gl :)
Interfaces::Surface()->SetFontGlyphSet(font, XorStr("Open Sans Bold"), 22, 300, 0, 0, FONT_CREATE_ANTIALIASED);
您要适应您的上下文渲染,问候。
FONT
是 standard resource type,与 PNG
不同。因此,您必须使用 RT_FONT
而不是 L"FONT"
。
资源声明可以保留为:
IDF_ROBOTBLACK FONT "filename.ttf"
资源必须位于如下位置:
FindResource(NULL, MAKEINTRESOURCE(IDF_ROBOTBLACK), RT_FONT);
或者,您可以使用:
IDF_ROBOTBLACK xfont "filename.ttf"
FindResource(NULL, MAKEINTRESOURCE(IDF_ROBOTBLACK), L"xfont");
这可行,因为 xfont
不是标准资源(与 PNG
相同)。
或者,您始终可以使用 RCDATA
和 RT_RCDATA
。