FindResource试图从资源加载字体时返回NULL

FindResource returns NULL when trying to load a font from resources

本文关键字:字体 返回 NULL 加载 资源 FindResource      更新时间:2023-10-16

我正在尝试从资源中加载字体。这是我使用的呼叫,目前返回null,因此失败:

HRSRC rsrcData = FindResource(NULL, MAKEINTRESOURCE(IDF_ROBOTBLACK), L"FONT");

我将字体资源添加到我的资源。RC文件,现在列出以下内容:

/////////////////////////////////////////////////////////////////////////////
//
// Font
//
IDF_ROBOTBLACK          FONT                    "Resources\Fonts\Roboto\Roboto-Black.ttf"

此外,这是我的资源。H的样子:

#define IDF_ROBOTBLACK                  108
据我所知,这应该是整个过程的全部。

我已经成功地设法加载了另一种资源格式" PNG",该格式也被添加为一种新的自定义资源类型,遵循相同的过程,同时仅将" png"替换为" png"。<<<<<<<<。/p>

但是,与我的" PNG"加载方法相比,从未找到"字体"。FindResource返回null,无论发生什么情况。

getlastror()的错误代码retrend Retrend是1813。

我担心的是.ttf根本没有真正支持。我之前添加了所有类型的格式,例如.exe和.png,.jpg,但是在添加资源时,在文件选择器中甚至没有建议.ttf。

它不是要以这种方式存储吗?

FONT是一种标准资源类型,与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相同)。

或者,您始终可以使用RCDATART_RCDATA

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());
}
  1. 将它们添加到注册表中(您需要禁用UAC或询问用户许可)

您可以看

hkey_local_machine software Microsoft Microsoft Windows NT CurrentVersion Fonts查看如何做。

  1. 完成所有字体后,您可以广播更改

    SendMessage(hWnd, WM_FONTCHANGE, 0, 0);
    
  2. 在Isurface

    中调用此功能
    virtual void ResetFontCaches() = 0;
    
  3. 测试和GL:)

    Interfaces::Surface()->SetFontGlyphSet(font, XorStr("Open Sans Bold"), 22, 300, 0, 0, FONT_CREATE_ANTIALIASED);
    

您要适应您的上下文渲染,问候。