3

次のコードは、実行可能ファイルに保存されているバイナリ リソースからシステム メモリにフォントをロードするために機能するはずですが、私が見つけたすべての例に従っていますが、機能していません。「myfont」は、リソース ファイル内の IDR_FONT に関連付けられている ttf の名前です。

    DWORD   Count ;
    HRSRC   Resource = FindResource(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_FONT),"BINARY") ;
    DWORD   Length   = SizeofResource(GetModuleHandle(NULL),Resource) ;
    HGLOBAL Address  = LoadResource(GetModuleHandle(NULL),Resource) ;
    HANDLE Handle = AddFontMemResourceEx(Address,Length,0,&Count) ;
    if(Handle==0)
    {
        MessageBox(hWnd,"Font load failed", "Error",NULL);
    }



        LOGFONT logfont; //set window font
        logfont.lfCharSet = DEFAULT_CHARSET;
        logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
        logfont.lfEscapement = 0;
        memcpy(logfont.lfFaceName, "myfont", LF_FACESIZE); 
        logfont.lfHeight = 14; 
        logfont.lfItalic = FALSE; 
        logfont.lfOrientation = 0;
        logfont.lfOutPrecision = OUT_TT_PRECIS;
        logfont.lfQuality = PROOF_QUALITY;
        logfont.lfStrikeOut = FALSE;
        logfont.lfUnderline = FALSE;
        logfont.lfWeight = FW_DONTCARE; 
        hFont = CreateFontIndirect(&logfont);

私が間違ってやっているアイデアはありますか?

4

1 に答える 1

4

コードには2つの問題があります。

API関数の失敗をチェックしていません。は標準のリソースタイプではないため、への呼び出しFindResource()は失敗している可能性があります。代わりに、ユーザー定義のリソースを使用する必要があります。"BINARY"RCDATA

HRSRC Resource = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_FONT), RT_RCDATA);

またはFONT、それが実際の標準FONTリソースである場合は、次のようになります。

HRSRC Resource = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_FONT), RT_FONT);

ただし、リソースタイプの実際の名前は、実行可能ファイルにリソースを追加するために使用した.RCファイルの内容によって異なります。

もう1つの問題は、さらに重要なことですが、実際にはリソースの生データにアクセスしていないため、実際のフォントデータをに渡すことができますAddFontMemResourceEx()。そのために使用する必要がありますLockResource()

代わりに、次のようなものを試してください。

HANDLE AddResourceFont(LPCTSTR ResID, DWORD *Installed)
{
    if (Installed) *Installed = 0;

    HMODULE hMod = GetModuleHandle(NULL);
    DWORD Count, ErrorCode;

    HRSRC Resource = FindResource(hMod, ResID, RT_RCDATA); // or RT_FONT or whatever your actual resource type is
    if (!Resource)
    {
        ErrorCode = GetLastError();
        //...
        return NULL;
    }

    DWORD Length = SizeofResource(hMod, Resource);
    if ((Length == 0) && (GetLastError() != 0))
    {
        ErrorCode = GetLastError();
        //...
        return NULL;
    }

    HGLOBAL Address = LoadResource(hMod, Resource);
    if (!Address)
    {
        ErrorCode = GetLastError();
        //...
        return NULL;
    }

    PVOID FontData = LockResource(Address);
    if (!FontData)
    {
        ErrorCode = GetLastError();
        //...
        return NULL;
    }

    HANDLE Handle = AddFontMemResourceEx(FontData, Length, 0, &Count);
    if (!Handle)
    {
        ErrorCode = GetLastError();
        //...
        return NULL;
    }

    if (Installed) *Installed = Count;
    return Handle;
}

DWORD Count = 0;
HANDLE hFont = AddResourceFont(MAKEINTRESOURCE(IDR_FONT), &Count);
if (hFont)
{
    //...
    RemoveFontMemResourceEx(hFont);
}
于 2013-03-05T20:20:37.080 に答える