我在自己的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);
}
}
答案 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()
。