Использование шрифта Unicode в консольном приложении C++

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

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

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


EDIT:

Ok, дополнительная информация. Когда я просто использую этот маленький фрагмент:

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);

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

3 ответов


для Vista и выше, есть SetCurrentConsoleFontEx, а уже сказал.

для 2K и XP существует недокументированная функция SetConsoleFont; например,здесь.

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);

теперь console_font_index - это индекс в таблицу шрифтов консоли, определение которого неизвестно. Однако,console_font_index == 10, как известно, идентифицирует консоль Lucida (шрифт Unicode). Я не уверен, насколько стабильно это значение в разных ОС версии.

обновление

после комментария Датта я провел эксперимент по чистой настройке XP SP2.

  • первоначально GetNumberOfConsoleFonts (), действительно, возвращает 10, а индексы шрифтов 0..9 укажите различные растровые шрифты.

  • после того, как я открою консоль с шрифтом Lucida, выбранным в его свойствах (только один раз; я могу закрыть его сразу после открытия, но эффект тот же), внезапно GetNumberOfConsoleFonts () начинает возвращать 12, а индексы 10 и 11 выбирают Lucida разных размеров.

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

таким образом, для практических целей, ответ Джона Хансона кажется лучше. Кроме того, предлагая лучший контроль, он на самом деле работает. :)


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

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

вы также можете progmatically изменения в реестр хотя я сомневаюсь,что это возымеет немедленный эффект.r.т. в окно консоли.


вы можете попробовать SetCurrentConsoleFontEx ()