Color Update
This commit is contained in:
parent
8d334cdd8e
commit
d60e6bfc4c
13 changed files with 201 additions and 5 deletions
189
GATE-PLAYGROUND/Class1.cs
Normal file
189
GATE-PLAYGROUND/Class1.cs
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
// Copyright Alex Shvedov
|
||||
// Modified by MercuryP with color specifications
|
||||
// Use this code in any way you want
|
||||
|
||||
using System;
|
||||
using System.Diagnostics; // for Debug
|
||||
using System.Drawing; // for Color (add reference to System.Drawing.assembly)
|
||||
using System.Runtime.InteropServices; // for StructLayout
|
||||
|
||||
class SetScreenColorsApp
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal struct COORD
|
||||
{
|
||||
internal short X;
|
||||
internal short Y;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal struct SMALL_RECT
|
||||
{
|
||||
internal short Left;
|
||||
internal short Top;
|
||||
internal short Right;
|
||||
internal short Bottom;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal struct COLORREF
|
||||
{
|
||||
internal uint ColorDWORD;
|
||||
|
||||
internal COLORREF(Color color)
|
||||
{
|
||||
ColorDWORD = (uint)color.R + (((uint)color.G) << 8) + (((uint)color.B) << 16);
|
||||
}
|
||||
|
||||
internal COLORREF(uint r, uint g, uint b)
|
||||
{
|
||||
ColorDWORD = r + (g << 8) + (b << 16);
|
||||
}
|
||||
|
||||
internal Color GetColor()
|
||||
{
|
||||
return Color.FromArgb((int)(0x000000FFU & ColorDWORD),
|
||||
(int)(0x0000FF00U & ColorDWORD) >> 8, (int)(0x00FF0000U & ColorDWORD) >> 16);
|
||||
}
|
||||
|
||||
internal void SetColor(Color color)
|
||||
{
|
||||
ColorDWORD = (uint)color.R + (((uint)color.G) << 8) + (((uint)color.B) << 16);
|
||||
}
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal struct CONSOLE_SCREEN_BUFFER_INFO_EX
|
||||
{
|
||||
internal int cbSize;
|
||||
internal COORD dwSize;
|
||||
internal COORD dwCursorPosition;
|
||||
internal ushort wAttributes;
|
||||
internal SMALL_RECT srWindow;
|
||||
internal COORD dwMaximumWindowSize;
|
||||
internal ushort wPopupAttributes;
|
||||
internal bool bFullscreenSupported;
|
||||
internal COLORREF black;
|
||||
internal COLORREF darkBlue;
|
||||
internal COLORREF darkGreen;
|
||||
internal COLORREF darkCyan;
|
||||
internal COLORREF darkRed;
|
||||
internal COLORREF darkMagenta;
|
||||
internal COLORREF darkYellow;
|
||||
internal COLORREF gray;
|
||||
internal COLORREF darkGray;
|
||||
internal COLORREF blue;
|
||||
internal COLORREF green;
|
||||
internal COLORREF cyan;
|
||||
internal COLORREF red;
|
||||
internal COLORREF magenta;
|
||||
internal COLORREF yellow;
|
||||
internal COLORREF white;
|
||||
}
|
||||
|
||||
const int STD_OUTPUT_HANDLE = -11; // per WinBase.h
|
||||
internal static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); // per WinBase.h
|
||||
|
||||
[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);
|
||||
|
||||
// Set a specific console color to an RGB color
|
||||
// The default console colors used are gray (foreground) and black (background)
|
||||
public static int SetColor(ConsoleColor consoleColor, Color targetColor)
|
||||
{
|
||||
return SetColor(consoleColor, targetColor.R, targetColor.G, targetColor.B);
|
||||
}
|
||||
|
||||
public static int SetColor(ConsoleColor color, uint r, uint g, uint b)
|
||||
{
|
||||
CONSOLE_SCREEN_BUFFER_INFO_EX csbe = new CONSOLE_SCREEN_BUFFER_INFO_EX();
|
||||
csbe.cbSize = (int)Marshal.SizeOf(csbe); // 96 = 0x60
|
||||
IntPtr hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE); // 7
|
||||
if (hConsoleOutput == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
return Marshal.GetLastWin32Error();
|
||||
}
|
||||
bool brc = GetConsoleScreenBufferInfoEx(hConsoleOutput, ref csbe);
|
||||
if (!brc)
|
||||
{
|
||||
return Marshal.GetLastWin32Error();
|
||||
}
|
||||
|
||||
switch (color)
|
||||
{
|
||||
case ConsoleColor.Black:
|
||||
csbe.black = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.DarkBlue:
|
||||
csbe.darkBlue = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.DarkGreen:
|
||||
csbe.darkGreen = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.DarkCyan:
|
||||
csbe.darkCyan = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.DarkRed:
|
||||
csbe.darkRed = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.DarkMagenta:
|
||||
csbe.darkMagenta = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.DarkYellow:
|
||||
csbe.darkYellow = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.Gray:
|
||||
csbe.gray = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.DarkGray:
|
||||
csbe.darkGray = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.Blue:
|
||||
csbe.blue = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.Green:
|
||||
csbe.green = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.Cyan:
|
||||
csbe.cyan = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.Red:
|
||||
csbe.red = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.Magenta:
|
||||
csbe.magenta = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.Yellow:
|
||||
csbe.yellow = new COLORREF(r, g, b);
|
||||
break;
|
||||
case ConsoleColor.White:
|
||||
csbe.white = new COLORREF(r, g, b);
|
||||
break;
|
||||
}
|
||||
++csbe.srWindow.Bottom;
|
||||
++csbe.srWindow.Right;
|
||||
brc = SetConsoleScreenBufferInfoEx(hConsoleOutput, ref csbe);
|
||||
if (!brc)
|
||||
{
|
||||
return Marshal.GetLastWin32Error();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int SetScreenColors(Color foregroundColor, Color backgroundColor)
|
||||
{
|
||||
int irc;
|
||||
irc = SetColor(ConsoleColor.Gray, foregroundColor);
|
||||
if (irc != 0) return irc;
|
||||
irc = SetColor(ConsoleColor.Black, backgroundColor);
|
||||
if (irc != 0) return irc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue