Mithilfe der Unicode-font in C++ console app
Wie ändere ich die schriftart in meinem C++ - Windows-Konsole-app?
Es scheint nicht, die Verwendung der schriftart cmd.exe standardmäßig verwendet (Lucida Console). Wenn ich meine app durch ein vorhandenes cmd.exe (Eingabe name.exe) sieht es wie folgt aus: http://dathui.mine.nu/konsol3.png die entierly richtig.
Aber wenn ich meine app separat (doppelklicken Sie auf die .exe) sieht es wie folgt aus: http://dathui.mine.nu/konsol2.png.
Derselbe code zwei verschiedene looks.
So, jetzt meine Frage wie kann ich die schriftart ändern, so dass es sieht immer richtig, unabhängig davon, wie Sie ausgeführt werden.
EDIT:
Ok, ein paar mehr Informationen. Als ich gerade dieses kleine snippet:
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);
es funktioniert mit der richtigen Schrift. Aber in meiner realen Anwendung verwende ich WriteConsoleOutput()
zu druckenden Zeichenfolgen statt:
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);
}
und dann verwendet er die falsche schriftart. Ich benutze zwei verschiedene Fenster, wie folgt erstellt:
mHandleA = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0,
NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
Könnte ich die Einstellung der codepage nur für die standard-Ausgabe oder sowas???
- Hm ... komisch, gibt es eine Möglichkeit zu erkennen, Konsole vs doppelklicken Sie mit wenigen Ausnahmefällen. Dieser Artikel ist ein guter Anfang, aber es geht nicht weit genug: codeguru.com/cpp/misc/misc/consoleapps/article.php/c15893
- Welche compiler verwenden Sie ?
- Vielleicht verfolgen Sie die startup-code aus der pre-main () -, um zu sehen, was code ist tatsächlich für die Konsole-Fenster selbst? Ich gehe davon aus, dass es code, der Teil von Ihr .exe-Datei geliefert, die von der compiler - / Konsolen-Projekt, das erkennt, wenn die app startet in einer Konsole schon, oder wenn es braucht, in dem Fall schafft ein Konsole-Fenster für Sie. Das ist meine intuition, nicht recherchiert Tatsache, könnte aber nachprüfbar mit nur ein paar Minuten zu Debuggen. An welcher Stelle sehen Sie den Quellcode für dieses, und sehen, was Sie möglicherweise tun müssen, um Zugriff auf die Konsole HWND, um die schriftart anders...
- Ipthnc: klingt wie ein Umweg, aber danke für den Tipp. SjB: Visual Studio 2008 proff. Mordachai: Hm, wo könnte ich finde die pre-main-code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für Vista und höher gibt es SetCurrentConsoleFontEx, wie bereits sagte.
Für 2K und XP gibt es eine undokumentierte Funktion
SetConsoleFont
; z.B. Lesen hier.Nun
console_font_index
ist ein index in console-font-Tabelle, definition unbekannt ist. Allerdingsconsole_font_index == 10
bekannt ist, zu identifizieren, Lucida Console (eine Unicode-schriftart). Ich bin mir nicht sicher, wie stabil ist dieser Wert über die verschiedenen OS-Versionen.UPDATE
Nachdem dutt ist Kommentar, ich habe ein experiment ausführen, auf eine saubere XP-SP2-setup.
Zunächst GetNumberOfConsoleFonts(), in der Tat, gibt 10 und font-Indizes 0..9 geben Sie verschiedene raster-Schriftarten.
Nachdem ich das öffnen einer Konsole mit Lucida-schriftart ausgewählt, die in Ihren Eigenschaften (nur einmal; ich kann es schließen sofort nach dem öffnen, aber der Effekt ist der gleiche), plötzlich GetNumberOfConsoleFonts() beginnt die Rückkehr 12, und-Indizes, 10 und 11 wählen Sie Lucida in verschiedenen Größen.
So scheint es, mit diesem trick arbeitete für mich, wenn ich spielte mit ihm, denn ich hatte immer läuft mindestens eine Konsole app mit Lucida-schriftart ausgewählt.
So, für praktische Zwecke, jon hanson ' s Antwort scheint besser. Neben dem Angebot eine bessere Kontrolle, es funktioniert tatsächlich. 🙂
Speichert Windows die cmd-Einstellungen (einschließlich der schriftart) in der registry mit den exe-Pfad als Schlüssel. Der root-Schlüssel "HKEY_CURRENT_USER\Console' also, wenn Sie schauen in es mit regedit, Sie sollten sehen, mehrere sub-keys benannt nach varous exe.
Kopieren der Einstellungen einer vorhandenen exe-Datei, exportieren Sie die Taste, um eine text-Datei, und Bearbeiten Sie anschließend die Datei, um den Schlüssel zu ändern Namen der exe-Datei, importieren Sie Sie dann erneut.
Können Sie auch progmatically die Registrierung ändern, obwohl ich bezweifle, dass würde sofort wirksam w.r.t. der Konsole-Fenster.
Könnten Sie versuchen, die SetCurrentConsoleFontEx() Funktion.