Функция AddFontResourceEx не работает должным образом в проекте WinAPI
Я работаю над собственным проектом WinAPI и использую ANSI-версию языка API 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 ответ
Попробуйте это вместо этого:
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()
для этого.