【问题标题】:Function AddFontResourceEx does not work properly in the WinAPI project函数 AddFontResourceEx 在 WinAPI 项目中无法正常工作
【发布时间】:2014-07-23 19:03:03
【问题描述】:

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

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

字体“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);  
    }
}

【问题讨论】:

  • 并使用 ANSI 版本 - 你的问题。除非您计划支持将近 20 年历史的 Windows 版本,否则请始终使用宽版本的 winapi 函数,在这种情况下您应该使用 TCHARs。

标签: c++ winapi fonts ansi


【解决方案1】:

试试这个:

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()。看看PathRemoveFileSpec()PathCombine()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 2020-08-21
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多