Heim > Backend-Entwicklung > C++ > Wie kann ich benutzerdefinierte Farben (z. B. Orange) in meiner C#-Konsolenanwendung anzeigen?

Wie kann ich benutzerdefinierte Farben (z. B. Orange) in meiner C#-Konsolenanwendung anzeigen?

Mary-Kate Olsen
Freigeben: 2025-01-02 17:25:40
Original
605 Leute haben es durchsucht

How Can I Display Custom Colors (Like Orange) in My C# Console Application?

Farbiger Text in Konsolenanwendungen

Die integrierte ConsoleColor-Enumeration bietet eine begrenzte Auswahl an Textfarben für C#-Konsolenanwendungen. Es kann jedoch vorkommen, dass Sie eine bestimmte Farbe wünschen, z. B. Orange, die nicht enthalten ist.

Einschränkungen der ConsoleColor-Enumeration

Die ConsoleColor-Enumeration listet den unterstützten Text auf Farben, die sind:

Black
DarkBlue
DarkGreen
DarkCyan
DarkRed
DarkMagenta
DarkYellow
Gray
DarkGray
Blue
Green
Cyan
Red
Magenta
Yellow
White
Nach dem Login kopieren

Wie Sie sehen können, ist Orange in diesem Satz nicht vorhanden Farben.

Benutzerdefinierte Textfarbe über P/Invoke

Um benutzerdefinierte Textfarben zu erreichen, können wir in die Bereiche des Plattformaufrufs (P/Invoke) eintauchen. Durch die Verwendung der SetConsoleScreenBufferInfoEx()-Funktion aus der Bibliothek kernel32.dll können wir die Farbeinstellungen der Konsole direkt manipulieren.

Definieren Sie zunächst die erforderlichen Datenstrukturen:

[StructLayout(LayoutKind.Sequential)]
internal struct COORD
{
    public short X;
    public short Y;
}

[StructLayout(LayoutKind.Sequential)]
internal struct SMALL_RECT
{
    public short Left;
    public short Top;
    public short Right;
    public short Bottom;
}

[StructLayout(LayoutKind.Sequential)]
internal struct COLORREF
{
    public uint ColorDWORD;
    
    public COLORREF(Color color)
    {
        ColorDWORD = (uint) color.R + (((uint) color.G) << 8) + (((uint) color.B) << 16);
    }
}

[StructLayout(LayoutKind.Sequential)]
internal struct CONSOLE_SCREEN_BUFFER_INFO_EX
{
    public int cbSize;
    public COORD dwSize;
    public COORD dwCursorPosition;
    public ushort wAttributes;
    public SMALL_RECT srWindow;
    public COORD dwMaximumWindowSize;
    public ushort wPopupAttributes;
    public bool bFullscreenSupported;
    ...
}
Nach dem Login kopieren

Dann importieren Sie die Erforderliche Funktionen von kernel32.dll:

[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetStdHandle(int nStdHandle);

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool GetConsoleScreenBufferInfoEx(IntPtr hConsoleOutput, ref CONSOLE_SCREEN_BUFFER_INFO_EX csbe);

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetConsoleScreenBufferInfoEx(IntPtr hConsoleOutput, ref CONSOLE_SCREEN_BUFFER_INFO_EX csbe);
Nach dem Login kopieren

Benutzerdefiniert festlegen Farben

Mit diesen Tools können wir jetzt Methoden definieren, um bestimmte Konsolenfarben, einschließlich Orange, festzulegen:

public static int SetColor(ConsoleColor consoleColor, Color targetColor)
{
    // Fetch console details
    CONSOLE_SCREEN_BUFFER_INFO_EX csbe = new CONSOLE_SCREEN_BUFFER_INFO_EX();
    csbe.cbSize = (int)Marshal.SizeOf(csbe);
    IntPtr hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    bool brc = GetConsoleScreenBufferInfoEx(hConsoleOutput, ref csbe);
    if (!brc)
        return Marshal.GetLastWin32Error();

    // Set the specified color component
    switch (consoleColor)
    {
        case ConsoleColor.Black:
            csbe.black = new COLORREF(targetColor);
            break;
        ...
        // Other colors defined similarly
    }
    
    // Apply the Color
    brc = SetConsoleScreenBufferInfoEx(hConsoleOutput, ref csbe);
    if (!brc)
        return Marshal.GetLastWin32Error();
    
    return 0;
}

public static int SetScreenColors(Color foregroundColor, Color backgroundColor)
{
    int irc = SetColor(ConsoleColor.Gray, foregroundColor);
    if (irc != 0) return irc;
    irc = SetColor(ConsoleColor.Black, backgroundColor);
    return irc;
}
Nach dem Login kopieren

Sehen wir uns nun ein Beispiel von SetScreenColors in Aktion an:

static void Main(string[] args)
{
    Color screenTextColor = Color.Orange;
    Color screenBackgroundColor = Color.Black;
    SetScreenColors(screenTextColor, screenBackgroundColor);
    
    Console.WriteLine("Hello World!");
    Console.ReadKey();
}
Nach dem Login kopieren

Mit der oben genannten Methode können Sie die Vordergrund- und Hintergrundfarben Ihrer Konsole auf beliebige RGB-Werte, einschließlich Orange, einstellen. Viel Spaß beim Anpassen Ihrer Konsolenausgabe!

Das obige ist der detaillierte Inhalt vonWie kann ich benutzerdefinierte Farben (z. B. Orange) in meiner C#-Konsolenanwendung anzeigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage