首頁 > 後端開發 > C++ > 如何在我的 C# 控制台應用程式中顯示自訂顏色(如橙色)?

如何在我的 C# 控制台應用程式中顯示自訂顏色(如橙色)?

Mary-Kate Olsen
發布: 2025-01-02 17:25:40
原創
632 人瀏覽過

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

控制台應用程式中的彩色文字

內建 ConsoleColor 枚舉為 C# 控制台應用程式提供了有限的文字顏色選擇。但是,有時您可能需要特定的顏色,例如橙色,但該顏色未包含在內。

ConsoleColor 列舉的限制

ConsoleColor 列舉列出了支援的文字顏色,分別是:

Black
DarkBlue
DarkGreen
DarkCyan
DarkRed
DarkMagenta
DarkYellow
Gray
DarkGray
Blue
Green
Cyan
Red
Magenta
Yellow
White
登入後複製

如您所見,橘色不存在於這組顏色中

透過P/Invoke 自訂文字顏色

要實作自訂文字顏色,我們可以深入研究平台呼叫 (P/Invoke) 領域。透過利用kernel32.dll庫中的SetConsoleScreenBufferInfoEx()函數,我們可以直接操作控制台的顏色設定。

首先,定義必要的資料結構:

[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;
    ...
}
登入後複製

然後,匯入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);
登入後複製

設定自訂顏色

使用這些工具,我們現在可以定義方法來設定特定的控制台顏色,包括橘色:

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;
}
登入後複製

現在,讓我們來看看SetScreenColors 的範例:

static void Main(string[] args)
{
    Color screenTextColor = Color.Orange;
    Color screenBackgroundColor = Color.Black;
    SetScreenColors(screenTextColor, screenBackgroundColor);
    
    Console.WriteLine("Hello World!");
    Console.ReadKey();
}
登入後複製

透過使用上述方法,您可以將控制台的前景色和背景色設定為任何所需的 RGB 值,包括橘色。享受自訂控制台輸出的樂趣!

以上是如何在我的 C# 控制台應用程式中顯示自訂顏色(如橙色)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板