使用字体资源进行编译

时间:2017-07-05 14:17:56

标签: c++ visual-studio resources directx-9

我在Windows 8.1,Visual Studio 2017上。

我在我正在研究的directx项目中使用这种定价字体。

我使用AddFontResourceEx加载它并使用D3DXCreateFont为其创建字体。

当我点击“Local Windows Debugger”时,一切都很好,字体渲染。无论是在发布模式还是在调试模式下。 当我浏览任何可执行文件时出现问题,它从不呈现所述字体,无论是发布还是调试。

所以我去读书,我在必要时阅读msdn,this one和其他人的文章。

我认为我做错了什么,我的资源视图看起来像这样:

Resource View

,IDR_FONT1如下所示:

enter image description here

该文件自动加载到解决方案资源管理器中(我没有添加它,VS从Resource.rc文件中添加),如下所示:

enter image description here

有了这些礼仪:

enter image description here

我这样添加:

AddFontResourceEx("pricedown.ttf", FR_PRIVATE, 0);
this->createFont("Pricedown", 60, true, false);

其中createfont是我添加字体的功能(剥离,它有数组):

bool    D3D9Render::createFont(char *name, int size, bool bold, bool italic)
{
    D3DXCreateFont(m_pD3dDev, size, 0, (bold) ? FW_BOLD : FW_NORMAL, 0, (italic) ? 1 : 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH, name, &m_pFont);
    return true;
}

我正在将其编译为x64版本。

正如我所说,当我按下“本地Windows调试器”(在包括x64版本的任何模式下)时,它可以工作并呈现字体,但是当我转到project/x64/Release时,它只是不会呈现字体。即使是可执行的大小也足够了。

GetLastError上的

AddFontResource为2(ERROR_FILE_NOT_FOUND)

我做错了什么?

1 个答案:

答案 0 :(得分:0)

(直到最后阅读答案,否则你会浪费很多时间。)

我明白了。我阅读了this博文。

  

以下是有关如何在资源中嵌入的字体文件中使用AddFontMemResourceEx的示例。

HINSTANCE hResInstance = AfxGetResourceHandle( ); //Read the edit

HRSRC res = FindResource(
    hResInstance, 
    MAKEINTRESOURCE(IDR_MYFONT),
    L"BINARY"  //Read The Edit
); 
if (res) 
{
    HGLOBAL mem = LoadResource(hResInstance, res);
    void *data = LockResource(mem);
    size_t len = SizeofResource(hResInstance, res);

    DWORD nFonts;
    m_fonthandle = AddFontMemResourceEx(
        data,       // font resource
        len,       // number of bytes in font resource 
        NULL,          // Reserved. Must be 0.
        &nFonts      // number of fonts installed
        );

    if(m_fonthandle==0)
    {
        MessageBox(L"Font add fails", L"Error");
    }
}

虽然你需要afxwin.h ,而且来自here

  

afxwin.h是MFC,MFC不包含在VC ++的免费版本中   (快递版)

修改

您不需要使用AfxGetResourceHandle(为什么需要afxwin.h),您可以这样做:

HINSTANCE hResInstance = (HINSTANCE)GetModuleHandle(NULL);

FindResource中,第三个参数应为RT_FONT,因此您可以获得:

HRSRC res = FindResource(hResInstance, MAKEINTRESOURCE(IDR_FONT1), RT_FONT);