函数AddFontResourceEx在WinAPI项目中无法正常工作

时间:2014-07-23 19:03:04

标签: c++ winapi fonts ansi

我在自己的WinAPI项目上工作并使用ANSI语言的C / C ++版本,但是当我在非俄语版本的Windows计算机上运行程序时,我遇到了这个问题。我看到不可读的符号而不是俄文字母。

我尝试使用方法AddFontResourceEx,并且在俄语版本的Windows上它可以正常工作但是当我在非俄语版本的Windows上运行时,我遇到了错误"字体1错误"而且我看到了不可读的符号。 我该如何解决这个问题?

字体" MY_ARIAL.TTF"在exe文件的文件夹中

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static LOGFONT lf1; 

    switch (uMsg)
    {
    case WM_CREATE:

         if(AddFontResourceEx("MY_ARIAL.TTF", FR_PRIVATE, NULL)!=0)
         {
             SendMessage(HWND_BROADCAST, WM_FONTCHANGE,0,0);
             lstrcpy((LPSTR)&lf1.lfFaceName, "My_Arial");           
         }
         else       
             MessageBox(hWnd,"Font 1 Error","error",MB_OK);  
    }
}

1 个答案:

答案 0 :(得分:0)

请改为尝试:

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static LOGFONT lf1 = {0}; 

    switch (uMsg)
    {
    case WM_CREATE:

         if (AddFontResourceEx(TEXT("MY_ARIAL.TTF"), FR_PRIVATE, NULL))
         {
             SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
             lstrcpy(lf1.lfFaceName, TEXT("My_Arial"));
         }
         else       
             MessageBox(hWnd, TEXT("Font 1 Error"), TEXT("error"), MB_OK);  
    }
}

或者:

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static LOGFONTW lf1 = {0}; 

    switch (uMsg)
    {
    case WM_CREATE:

         if (AddFontResourceExW(L"MY_ARIAL.TTF", FR_PRIVATE, NULL))
         {
             SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
             lstrcpyW(lf1.lfFaceName, L"My_Arial");
         }
         else       
             MessageBoxW(hWnd, L"Font 1 Error", L"error", MB_OK);  
    }
}

无论哪种方式,请记住,您正在指定AddFontResourceEx()相对路径,因此它会受到GetCurrentDirectory()返回的路径的影响,可能不会是你所期待的! 从不使用相对路径,始终使用绝对路径。您可以使用GetModuleFileName()检索应用程序的文件夹,然后删除文件名部分(最后'\'个字符后的所有内容)。然后,您可以将"MY_ARIAL.TTF"附加到该AddFontResourceEx()并将整个内容传递给{{1}}。请查看PathRemoveFileSpec()PathCombine()