Laden...

Farben in der Konsole

Erstellt von AyrA vor 10 Jahren Letzter Beitrag vor 10 Jahren 7.517 Views
AyrA Themenstarter:in
60 Beiträge seit 2010
vor 10 Jahren
Farben in der Konsole

Beschreibung:

meiner Meinung nach fehlt im .NET Framework die Fähigkeit Konsolentext farbig auszugeben. Die Implementierung über Console.ForegroundColor ist mir zu aufwändig, insbesondere, wenn ich eigentlich gerne mehrere Farben auf einer Zeile ausgeben möchte.
ich mag Konsolen Anwendungen nach wie vor, da sie einfaches Scripting erlauben, Fehlermeldungen oder ähnliches möchte ich dennoch gerne farblich hervorheben, ohne jedesmal irgendwelche Funktionen zu schreiben, die dann trotzdem in einem anderen Projekt nicht mehr passen.

Ich habe daher zwei Funktionen geschrieben, die die nervtötende Arbeit des Farbensetzens abnehmen.

Klasse


using System;
using System.Globalization;

namespace AyrA
{
    /// <summary>
    /// Bietet einfachen Zugriff um Text farbig darzustellen in der Konsole.
    /// </summary>
    public static class PrintColor
    {
        /// <summary>
        /// Gibt die Konsolenfarben zurück, hexadezimal sortiert, von 0-F
        /// </summary>
        public static ConsoleColor[] ColorRow
        {
            get
            {
                ConsoleColor[] c = new ConsoleColor[16];
                for (int i = 0; i < 16; i++)
                {
                    c[i] = (ConsoleColor)i;
                }
                return c;
            }
        }

        /// <summary>
        /// Schreibt eine Zeile mit farbigem Text, inklusive Zeilenumbruch
        /// </summary>
        /// <param name="text">Zu schreibender Text</param>
        /// <param name="mapF">Vordergrundfarben</param>
        /// <param name="mapB">Hintergrundfarben</param>
        public static void printColorL(string text, string mapF, string mapB)
        {
            printColor(text, mapF, mapB);
            Console.WriteLine();
        }

        /// <summary>
        /// Schreibt eine Zeile mit farbigem Text
        /// </summary>
        /// <param name="text">Zu schreibender Text</param>
        /// <param name="mapF">Vordergrundfarben</param>
        /// <param name="mapB">Hintergrundfarben</param>
        public static void printColor(string text, string mapF, string mapB)
        {
            int color=0;

            mapF = mapF.ToUpper().Replace(' ', '_');
            mapB = mapB.ToUpper().Replace(' ', '_');

            if (text.Length != mapF.Length || mapF.Length != mapB.Length)
            {
                throw new Exception("Alle Parameter müssen die selbe Textlänge aufweisen");
            }

            for (int i = 0; i < text.Length; i++)
            {
                if (mapF[i] != '_')
                {
                    if (!int.TryParse(mapF.Substring(i, 1), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out color))
                    {
                        throw new Exception(string.Format("Vordergrundfarbe an Position {0} ungültig. Ist: '{1}'", i, mapF[i]));
                    }
                }
                if (mapB[i] != '_')
                {
                    if (!int.TryParse(mapB.Substring(i, 1), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out color))
                    {
                        throw new Exception(string.Format("Hintergrundfarbe an Position {0} ungültig. Ist: '{1}'", i, mapF[i]));
                    }
                }
            }


            ConsoleColor[] C = new ConsoleColor[] { Console.ForegroundColor, Console.BackgroundColor };
            for (int i = 0; i < text.Length; i++)
            {
                if (mapF[i] != '_')
                {
                    Console.ForegroundColor = (ConsoleColor)int.Parse(mapF.Substring(i, 1), NumberStyles.HexNumber);
                }
                if (mapB[i] != '_')
                {
                    Console.BackgroundColor= (ConsoleColor)int.Parse(mapB.Substring(i, 1), NumberStyles.HexNumber);
                }
                Console.Write(text[i]);
            }
            Console.ForegroundColor = C[0];
            Console.BackgroundColor = C[1];
        }

    }
}


Beispiel eines Aufrufes (Ergebins, siehe Bild):


PrintColor.printColorL("Long Form:  target = ulong.MaxValue / ((payload.Length + addBytes + 8) * POW)",
                       "8___________C______F_E______________F___A______________F_9________F______D__F",
                       "0____________________________________________________________________________");
PrintColor.printColorL("Short Form: X = A / ((B + C + D) * E)",
                       "8___________C_F_E_F_F_A_F_9_F_F____DF",
                       "0____________________________________");

Durch Verwendung von mehreren Zeilen, wird die Funktion fast selbsterklärend,
ansonsten hier die Anleitung:
der erste Parameter ist jeweils die Zeichenkette.
Parameter Zwei ist das Mapping der Vordergrundfarben.
Parameter Drei ist analog für die Hintergrundfarbe.

Alle Strings müssen die selbe Länge aufweisen.
Die Farben werden hexadezimal von 0-F angegeben, Gross- und Kleinschreibung ist egal.
Der unterstrich (_) (auch Leerschlag ist erlaubt) wiederholt die vorherige Farbe.
Die Zuordnung von Farben zu Zahlen kann mit dem property ColorRow überprüft werden.
Ansonsten hier die Farbtabelle:

0 = Schwarz        8 = Dunkelgrau
1 = Dunkelblau     9 = Blau
2 = Dunkelgrün     A = Grün
3 = Blaugrün       B = Zyan
4 = Dunkelrot      C = Rot
5 = Lila           D = Magenta
6 = Ocker          E = Gelb
7 = Hellgrau       F = Weiß

Diese ist übrigens von dem Befehl COLOR /?
Die Farben sind aber kompatibel

Hinweis. Anstelle des Unterstrichs darf natürlich auch die Farbkonstante wiederholend angegeben werden.

Schlagwörter: Konsole CMD dos farbig Farbe Text schreiben farbiger

**:::