2017-09-28 16 views
3

내 리소스에서 글꼴을로드하려고합니다. 이것은 또한리소스에서 글꼴을로드 할 때 FindResource가 NULL을 반환합니다.

///////////////////////////////////////////////////////////////////////////// 
// 
// Font 
// 

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

:

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

내가 지금 다음 목록 내 Resource.rc 파일에 글꼴 리소스를 추가 :이 기능은 현재 NULL을 반환하기 때문에 실패 내가 사용하는 전화입니다 내 Resource.h는 다음과 같습니다.

#define IDF_ROBOTBLACK     108 

내가 알 수있는 한, 이것은 전체 프로세스에 있어야합니다.

"FONT"를 "PNG"로 바꿀 때와 동일한 절차에 따라 새 사용자 지정 리소스 유형으로 추가 된 다른 리소스 형식 인 "PNG"를 이미 성공적으로로드했습니다.

그러나 "PNG"로드 방식에 비해 "FONT"는 절대로 발견되지 않습니다. FindResource는 아무리 발생해도 NULL을 반환합니다.

GetLastError에 의한 오류 코드 returend()는 1813

내 관심은 정말 전혀 지원 .TTF 아니라고이다. 이전에 .exe 및 .png, .jpg와 같은 솔루션 리소스에 모든 형식을 추가했지만 리소스를 추가 할 때 파일 선택기에서 .ttf 제안을 제안하지 않았습니다.

이 방법으로 저장하는 것은 아닙니다.

답변

4

FONTPNG과 달리 standard resource type입니다. 따라서 L"FONT" 대신 RT_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를 참조하십시오.

    모든 글꼴을로드가 완료되면
  • 당신이

    virtual void ResetFontCaches() = 0; 
    
  • 테스트 ISurface에 변화를

    SendMessage(hWnd, WM_FONTCHANGE, 0, 0); 
    
  • 호출이 기능을 방송 할 수있다

      및 gl :

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

    당신은 컨텍스트 렌더링에 적응해야합니다.

  • +0

    나는 당신이 코드를 잘리는 방식으로 설명하고 있습니다. 그러나 LoadResource가 rsrcData가 NULL 인 NULL로 인해 실패하기 때문에 이후에는 아무 일도 일어나지 않습니다. – Sossenbinder

    +0

    @Sossenbinder 방금 작업을 수행하는 기능을 추가하면 저를 위해 실행됩니다;) 다음 번에는 gl입니다. –

    +1

    리소스에서 읽어와 디스크에 저장하는 것과는 반대로'AddFontMemResourceEx'를 사용할 수도 있습니다. –