windows 控制台 C++ 中的 RGB 颜色
RGB colors in windows console C++
我想尝试制作一个 class 能够将宽字符打印到具有特定 RGB 颜色的控制台。我知道控制台只有 16 个,但先看看。
Every color in console palette can be changed by setting the right buffer, so I wrote something like that:
//ConsolePX
#include <fcntl.h>
#include <io.h>
#include <Windows.h>
#include <iostream>
class ConsolePX
{
public:
wchar_t source;
COLORREF foreground, background;
/* Set at the start ctor */
ConsolePX(wchar_t _what, COLORREF foregroundColor, COLORREF backgroundColor)
{
source = _what;
foreground = foregroundColor;
background = backgroundColor;
}
/* Draws wchar_t with colors to console */
void Draw() {
HANDLE outH = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFOEX curr, newBuff;
curr.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
GetConsoleScreenBufferInfoEx(outH, &curr);
curr.srWindow.Bottom++;
newBuff = curr;
newBuff.ColorTable[0] = background;
newBuff.ColorTable[1] = foreground;
SetConsoleScreenBufferInfoEx(outH, &newBuff);
SetConsoleTextAttribute(outH, 1);
_setmode(_fileno(stdout), _O_U16TEXT); //Sets console mode to 16-bit unicode
std::wcout << source << std::endl;
_setmode(_fileno(stdout), _O_TEXT);
//Restores to defaults
SetConsoleTextAttribute(outH, 7);
SetConsoleScreenBufferInfoEx(outH, &curr);
}
};
//Driver code
#include "ConsolePX.h"
int main()
{
ConsolePX(L'█', RGB(29, 219, 79), RGB(0, 0, 0)).Draw();
return 0;
}
这行得通,但问题出在 ConsolePX
(恰好 SetConsoleScreenBufferInfoEx(outH, &curr)
)的最后一行。打印 wchar_t
后,我将调色板恢复为默认值。为什么这是个问题?我注意到控制台中的每个字符都没有固定到颜色,而是固定到调色板索引,所以在恢复到默认调色板后,我也恢复了 wchar_t
颜色。删除该行后,我将干扰其余代码。有没有办法在控制台中屏蔽 x, y 字符以避免颜色变化?
最重要的是,我使用的是 Visual Studio,正如您所猜到的,我使用的是 windows.
没有
你自己说的:有16种颜色可供选择。
当您认为自己已绕过该限制时,实际上您所做的只是更改这些颜色 "mean",即它们映射到该控制台的 RGB 值。
当前调色板适用于控制台的全部内容。如果没有,我们就不会局限于 16 种颜色。
所以,虽然你的尝试很有创意,但恐怕根本行不通。
如果你想像这样控制真实的颜色,制作一个 GUI 应用程序。
我想尝试制作一个 class 能够将宽字符打印到具有特定 RGB 颜色的控制台。我知道控制台只有 16 个,但先看看。
Every color in console palette can be changed by setting the right buffer, so I wrote something like that:
//ConsolePX #include <fcntl.h> #include <io.h> #include <Windows.h> #include <iostream> class ConsolePX { public: wchar_t source; COLORREF foreground, background; /* Set at the start ctor */ ConsolePX(wchar_t _what, COLORREF foregroundColor, COLORREF backgroundColor) { source = _what; foreground = foregroundColor; background = backgroundColor; } /* Draws wchar_t with colors to console */ void Draw() { HANDLE outH = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFOEX curr, newBuff; curr.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX); GetConsoleScreenBufferInfoEx(outH, &curr); curr.srWindow.Bottom++; newBuff = curr; newBuff.ColorTable[0] = background; newBuff.ColorTable[1] = foreground; SetConsoleScreenBufferInfoEx(outH, &newBuff); SetConsoleTextAttribute(outH, 1); _setmode(_fileno(stdout), _O_U16TEXT); //Sets console mode to 16-bit unicode std::wcout << source << std::endl; _setmode(_fileno(stdout), _O_TEXT); //Restores to defaults SetConsoleTextAttribute(outH, 7); SetConsoleScreenBufferInfoEx(outH, &curr); } };
//Driver code #include "ConsolePX.h" int main() { ConsolePX(L'█', RGB(29, 219, 79), RGB(0, 0, 0)).Draw(); return 0; }
这行得通,但问题出在 ConsolePX
(恰好 SetConsoleScreenBufferInfoEx(outH, &curr)
)的最后一行。打印 wchar_t
后,我将调色板恢复为默认值。为什么这是个问题?我注意到控制台中的每个字符都没有固定到颜色,而是固定到调色板索引,所以在恢复到默认调色板后,我也恢复了 wchar_t
颜色。删除该行后,我将干扰其余代码。有没有办法在控制台中屏蔽 x, y 字符以避免颜色变化?
最重要的是,我使用的是 Visual Studio,正如您所猜到的,我使用的是 windows.
没有
你自己说的:有16种颜色可供选择。
当您认为自己已绕过该限制时,实际上您所做的只是更改这些颜色 "mean",即它们映射到该控制台的 RGB 值。
当前调色板适用于控制台的全部内容。如果没有,我们就不会局限于 16 种颜色。
所以,虽然你的尝试很有创意,但恐怕根本行不通。
如果你想像这样控制真实的颜色,制作一个 GUI 应用程序。