gpt4 book ai didi

c++ - AddFontMemResourceEx

转载 作者:太空狗 更新时间:2023-10-29 21:02:29 26 4
gpt4 key购买 nike

根据我找到的所有示例,以下代码应该可以将字体从存储在我的可执行文件中的二进制资源加载到系统内存,但它不起作用。 "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);

知道我做错了什么吗?

最佳答案

您的代码有两个问题。

您没有检查任何 API 函数是否失败。您对 FindResource() 的调用很可能失败,因为 "BINARY" 不是 standard resource type .用户定义的资源应该使用 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);
}

关于c++ - AddFontMemResourceEx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15232801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com