繁体   English   中英

Windows 控制台 C++ 中的 RGB 颜色

[英]RGB colors in windows console C++

我想尝试制作一个能够将宽字符打印到具有特定 RGB 颜色的控制台的类。 我知道控制台只有 16 个,但先看看。

控制台调色板中的每种颜色都可以通过设置正确的缓冲区来改变,所以我写了这样的东西:

 //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; }

SetConsoleScreenBufferInfoEx(outH, &curr)但问题出在ConsolePX的最后一行(正是SetConsoleScreenBufferInfoEx(outH, &curr) )。 打印wchar_t我将调色板恢复为默认值。 为什么这是一个问题? 我注意到控制台中的每个字符都没有固定到颜色,而是固定到调色板索引,所以在恢复到默认调色板后,我也恢复了wchar_t颜色。 删除该行后,我将干扰其余代码。 有没有办法在控制台中阻止 x, y 字符以避免颜色变化? 重要的是,我使用的是 Visual Studio,而且正如您所猜到的,我使用的是 Windows。

不。

您自己说过:有 16 种颜色可供您选择。

当您认为自己绕过了该限制时,实际上您所做的只是更改这些颜色的“含义”,即它们映射到该控制台的 RGB 值。

当前调色板适用于控制台的整个内容。 如果没有,我们将不会仅限于 16 种颜色。

所以,虽然你的尝试很有创意,但恐怕从根本上是行不通的。

如果您想像这样控制真实的颜色,请制作一个 GUI 应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM