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

时间:2017-09-28 16:14:21

标签: c++ winapi embedded-resource

我正在尝试从我的资源加载字体。这是我使用的调用,它当前返回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”替换为“PNG”到期。 / p>

然而,与我的“PNG”加载方法相比,永远找不到“FONT”。无论发生什么,FindResource都会返回NULL。

GetLastError()的错误代码returend是1813年。

我担心的是.ttf根本不受支持。我以前在我的解决方案资源中添加了各种格式,例如.exe和.png,.jpg,但在添加资源时甚至没有在文件选择器中建议.ttf。

是不是意味着以这种方式存储?

2 个答案:

答案 0 :(得分:4)

FONT不同,

PNGstandard resource type。因此,您必须使用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

答案 1 :(得分:1)

在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或要求用户许可)
  2. 你可以看看

      

    HKEY_LOCAL_MACHINE \ SOFTWARE \ 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);
      
    4. 您要适应您的上下文呈现,问候。