Использование шрифта 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.т. в окно консоли.