winapi — C ++ Поиск индекса для шрифта, временно добавленного в системную таблицу шрифтов с помощью AddFontResource () для использования в консоли

Я пытаюсь временно установить шрифт для использования в консоли Win32 с

int AddFontResource(LPCTSTR lpszFilename);

а также

BOOL WINAPI SetConsoleFont(HANDLE hOutput, DWORD fontIndex)

Я получил эту функцию от этот сайт.

Хотя обе функции работают нормально, я понятия не имею, как найти добавленный индекс шрифта для использования с SetConsoleFont,

AddFontResource не возвращает значение индекса или ключ к временному шрифту.

Вот мой соответствующий код:

#include "Level.h"#include "ConsoleFont.h" //acquired from above mentioned site

#include <Windows.h>

//-------------------------------------------------------------------------------

void init();
void cleanup();

int main()
{
FileManager *pFileManager = new FileManager();     //unrelated
Level *lvl1 = new Level("filename",pFileManager);  //unrelated///TEMPORARY PLANNING
// using add font resource. how can i get this fonts index value?
int err = AddFontResource(L"Files/gamefont.fnt");
if (err == 0)
{
MessageBox(NULL,L"loading font failed",L"Error",0);
}
else
{
wchar_t message[100];
swprintf_s(message,100,L"AddFontResource returned: %d",err);
MessageBox(NULL,LPTSTR(message),L"error",0);
}
SendMessage(HWND_BROADCAST, WM_FONTCHANGE,0,0);

//acquiring handle to current active screen buffer
HANDLE tempHandle = GetStdHandle(STD_OUTPUT_HANDLE);
if (tempHandle == INVALID_HANDLE_VALUE)
{
MessageBox(NULL,L"Failed to aquire Screen Buffer handle",L"Error",0);
}

//I dont know what to set this to. this is the crux of the problem.
DWORD  fontIndex = 1;
if (FALSE == SetConsoleFont(tempHandle,fontIndex))
{
MessageBox(NULL,L"loading console font failed",L"Error",0);
}

//draws a house when in correct font
std::cout<<"!!!!!!!!#\n"<<"!!!!!!!!!\n"<<"! !! !! !\n"<<"!!!!!!!!!\n"<<"! !! !! !\n"<<"!!!!!!!!!\n"<<"! !! !! !\n"<<"!!!!!!!!!\n"<<"! !! !! !#\n"<<"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<std::endl;

///PLANNING OVERSbool quit = false;
while(!quit)
{
//still to be implemented
}err = RemoveFontResource(L"Files/gamefont.fnt");
if (err==0)
{
MessageBox(NULL,L"removing font failed",L"Error",0);
}
return 0;
}

Я не знаю, как найти значение индекса моего нового шрифта или даже если это возможно, используя мой текущий метод.

Если кто-то знает или имеет лучший метод, пожалуйста, помогите мне.
Любая помощь или советы приветствуются. Должна быть возможность использовать нестандартный шрифт в консоли win32 без возни с реестром. Я в этом уверен 🙂

1

Решение

К сожалению, вы вошли в темный мир на Win API. Нет документации (или, по крайней мере, я бы никогда не смог ее найти) для поиска в таблице шрифтов консоли. Вы можете попробовать метод «GetNumberOfConsoleFonts ()», чтобы увидеть, что возвращается. Я думаю, что шрифт в индексе 10 — Lucida Console. Тебе придется немного поиграть. Кроме того, это может не работать для вашей версии ОС. Работал у меня на XP. Никогда не приходилось примерять что-либо еще. И, честно говоря, он никогда не работал полностью на XP.

Для реестра

Реестры шрифтов здесь:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

Консольные реестры находятся здесь:

HKEY_CURRENT_USER\Console

Если вы в конечном итоге измените реестр, изменения могут не отражаться сразу. Вам нужно либо перезапустить консоль, либо отправить специальное сообщение WM_ * (извините, не помню имя).

Будет здорово, если вы сможете найти решение / обходной путь 🙂

2

Другие решения

   int err = AddFontResource(L"Files/gamefont.fnt");
if (err == 0)
{
MessageBox(NULL,L"loading font failed",L"Error",0);
}
else
{
wchar_t message[100];
swprintf_s(message,100,L"AddFontResource returned: %d",err);
MessageBox(NULL,LPTSTR(message),L"error",0);
}

это неправильно. AddFontResource возвращает количество загруженных шрифтов, поэтому код в ELSE не имеет смысла.

1