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

您的代码有两个问题。

您没有检查任何 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 文件的内容。

另一个问题,更重要的是,您实际上并没有访问资源的原始数据,因此您可以将真正的字体数据传递给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 回答