将 ConsoleColor 更改为十六进制值

Change ConsoleColor to a hex value

所以我最近开始学习 C#,并且正在努力将控制台的背景颜色更改为十六进制值。这是我的代码:

using System;

namespace MyFisrtC_App
{
    class Program
    {
        static void Main(string[] args)
        {
            ConsoleColor BGColor = ConsoleColor.White;
            ConsoleColor FGColor = ConsoleColor.Black;

            Console.Title = "Dumb App";
            Console.BackgroundColor = BGColor;
            Console.ForegroundColor = FGColor;

            Console.Clear();

            Console.WriteLine("This is just a simple dumb app. There is nothing special about it.");

            Console.ReadKey();
        }
    }
}

此外,如果您知道如何在 C# 中更改字体,那就太棒了。

using System;

namespace TestCSharp
{
class Program
{
    static void Main(string[] args)
    {
        Console.ForegroundColor = ConsoleColor.White;
        Console.BackgroundColor = ConsoleColor.Red;
        Console.WriteLine("background red and text white");
        Console.ResetColor();
        Console.WriteLine("Color reset");
        Console.ReadKey();
    }
  }
}

你不能使用十六进制值,你可以使用这些颜色:

黑色, 深蓝, 深绿色, 深青色, 深红, 深洋红色, 暗黄色, 灰色的, 深灰色, 蓝色的, 绿色的, 青色, 红色的, 品红, 黄色的, 白色

ConsoleColour 是一个枚举,它本质上是一个具有定义名称的数字列表。因此,您可以执行以下操作将数字转换为颜色

        int number = 7;
        ConsoleColor colour = (ConsoleColor)number;

如果你想从十六进制开始使用下面的

string hex = "0A";
int number = Convert.ToInt32(hex, 16);
ConsoleColor colour = (ConsoleColor)number;

你只需要确保数字不超出枚举的长度,例如

if(number < Enum.GetValues<ConsoleColor>().Length -1 && number >= 0)
{
   Console.ForeGroundColor = (ConsoleColor)number;
}

很遗憾,由于控制台的限制,这是不可能的 API。

但是您可以计算出与 API 中存在的颜色最接近的颜色。

static ConsoleColor ClosestConsoleColor(byte r, byte g, byte b)
{
    ConsoleColor ret = 0;
    double rr = r, gg = g, bb = b, delta = double.MaxValue;

    foreach (ConsoleColor cc in Enum.GetValues(typeof(ConsoleColor)))
    {
        var n = Enum.GetName(typeof(ConsoleColor), cc);
        var c = System.Drawing.Color.FromName(n == "DarkYellow" ? "Orange" : n); // bug fix
        var t = Math.Pow(c.R - rr, 2.0) + Math.Pow(c.G - gg, 2.0) + Math.Pow(c.B - bb, 2.0);
        if (t == 0.0)
            return cc;
        if (t < delta)
        {
            delta = t;
            ret = cc;
        }
    }
    return ret;
}

这来自: 全部归功于@Glenn