Используя Шрифт юникода в консольном приложении C++

Как я изменяю шрифт в своем приложении консоли Windows C++?

Это, кажется, не использует шрифт использование cmd.exe значением по умолчанию (Lucida Console). Когда я запускаю свое приложение через существующий cmd.exe (вводящий name.exe), оно похоже на это: http://dathui.mine.nu/konsol3.png, который совершенно корректен. Но когда я запускаю свое приложение seperatly (дважды щелкните по .exe), это похоже на это: http://dathui.mine.nu/konsol2.png. Тот же код, два различных взгляда.

Таким образом, теперь интересно, как я могу изменить шрифт, таким образом, это всегда смотрит правильно независимо от того, как это выполняется.


Править:

Хорошо, еще некоторая информация. Когда я просто использую этот небольшой отрывок:

SetConsoleOutputCP(CP_UTF8);
wchar_t s[] = L"èéøÞǽлљΣæča";
int bufferSize = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL);
char* m = new char[bufferSize]; 
WideCharToMultiByte(CP_UTF8, 0, s, -1, m, bufferSize, NULL, NULL);
wprintf(L"%S", m);

это работает с правильным шрифтом. Но в моем реальном приложении я использую WriteConsoleOutput() распечатать строки вместо этого:

CHAR_INFO* info = new CHAR_INFO[mWidth * mHeight];
for(unsigned int a = 0; a < mWidth*mHeight; ++a) {
    info[a].Char.UnicodeChar = mWorld.getSymbol(mWorldX + (a % mWidth), mWorldY + (a / mWidth));
    info[a].Attributes = mWorld.getColour(mWorldX + (a % mWidth), mWorldY + (a / mWidth));
}
COORD zero;
zero.X = zero.Y = 0;
COORD buffSize;
buffSize.X = mWidth;
buffSize.Y = mHeight;
if(!WriteConsoleOutputW(window, info, buffSize, zero, &rect)) {
    exit(-1);
}

и затем это использует неправильный шрифт. Я использую два различных окна, созданные как это:

mHandleA = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0,
                                     NULL, CONSOLE_TEXTMODE_BUFFER, NULL);

Я мог бы устанавливать кодовую страницу для просто стандартного вывода или чего-то?

8
задан Mr.C64 14 August 2014 в 16:41
поделиться

3 ответа

For Vista and above, there is SetCurrentConsoleFontEx, as already has been said.

For 2K and XP, there is an undocumented function SetConsoleFont; e.g. read here.

typedef BOOL (WINAPI *FN_SETCONSOLEFONT)(HANDLE, DWORD);
FN_SETCONSOLEFONT SetConsoleFont;
..........
HMODULE hm = GetModuleHandle(_T("KERNEL32.DLL"));
SetConsoleFont = (FN_SETCONSOLEFONT) GetProcAddress(hm, "SetConsoleFont");
// add error checking
..........

SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), console_font_index);

Now, console_font_index is an index into console font table, definition of which is unknown. However, console_font_index == 10 is known to identify Lucida Console (a Unicode font). I'm not sure how stable is this value across different OS versions.

UPDATE

After dutt's comment, I've run an experiment on a clean XP SP2 setup.

  • Initially, GetNumberOfConsoleFonts(), indeed, returns 10, and font indices 0..9 specify various raster fonts.

  • After I open a console with Lucida font selected in its properties (just once; I can close it immediately after opening but the effect is the same), suddenly GetNumberOfConsoleFonts() starts to return 12, and indices 10 and 11 select Lucida of different sizes.

So it seems this trick worked for me when I played with it because I always had running at least one console app with Lucida font selected.

Thus, for practical purposes, jon hanson's answer seems better. Besides offering better control, it actually works. :)

2
ответ дан 5 December 2019 в 19:00
поделиться

Windows сохраняет настройки cmd (включая шрифт) в реестре, используя путь exe в качестве ключа. Корневой ключ - это «HKEY_CURRENT_USER \ Console», поэтому, если вы заглянете туда с помощью regedit, вы увидите несколько подключей, названных в честь различных исполняемых файлов.

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

Вы также можете программно изменить реестр, хотя я сомневаюсь, что это немедленно вступит в силу в отношении окна консоли.

4
ответ дан 5 December 2019 в 19:00
поделиться

Вы можете попробовать функцию SetCurrentConsoleFontEx () .

3
ответ дан 5 December 2019 в 19:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: