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 应用程序。