C++ 尝试从资源加载字体时,FindResource返回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

我正在尝试从我的资源中加载字体。这是我使用的调用,当前返回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”,它也是作为一种新的自定义资源类型添加的,遵循相同的过程,同时只在到期时将“字体”替换为“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; ...
  • 将它们添加到注册表(您需要禁用UAC或向用户请求权限)
  • 你只要看看

    HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts查看如何执行此操作

  • 加载完所有字体后,可以广播更改

    SendMessage(hWnd, WM_FONTCHANGE, 0, 0);
    
  • 在ISurface中调用此函数

    virtual void ResetFontCaches() = 0;
    
  • 测试和gl:)

  • 请注意,您需要适应您的上下文呈现。

    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");