2017-09-28 140 views
3

我想從我的資源中加載字體。這是呼叫我使用,目前返回NULL,因此失敗:當嘗試從資源加載字體時,FindResource返回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」。

但是,與我的「PNG」加載方法相比,「FONT」從未找到。無論發生什麼,FindResource都返回NULL。

通過GetLastError函數的錯誤代碼returend()爲1813

我擔心的是.TTF是不是在所有真正支持。我之前在我的解決方案資源中添加了各種格式,例如.exe和.png,.jpg,但在添加資源時甚至沒有在文件選取器中建議.ttf。

這是不是意味着要這樣存儲?

回答

4

FONTstandard 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相同)。

或者,您可以隨時使用RCDATART_RCDATA

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()); 
} 
  • 將它們添加到註冊表(你需要禁用UAC或者徵得他的許可用戶)
  • 你可以只看

    HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Fonts查看如何操作。

  • 一旦你完成加載所有的字體,你可以播放變化

    SendMessage(hWnd, WM_FONTCHANGE, 0, 0); 
    
  • 調用此函數在ISurface

  • 測試和gl :)

    Interfaces::Surface()->SetFontGlyphSet(font, XorStr("Open Sans Bold"), 22, 300, 0, 0, FONT_CREATE_ANTIALIASED); 
    
  • 你要適應你的情境渲染,問候。

    +0

    我這樣做只是你在你的代碼中描述的方式剪斷。然而,之後會發生什麼並不重要,因爲LoadResource失敗,並且rsrcData爲NULL – Sossenbinder

    +0

    @Sossenbinder我只是添加了一個執行這個工作的函數,它爲我運行;)gl代表下一個問候。 –

    +1

    您也可以使用'AddFontMemResourceEx',而不是從資源讀取並保存到磁盤。 –

    相關問題