RGB цвета в windows консоли C ++ - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу создать класс, который сможет печатать широкие символы в консоли с указанным 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;
} 

И это сработало, но проблема в последней строке ConsolePX (точно SetConsoleScreenBufferInfoEx(outH, &curr)). После печати wchar_t я восстановил палитру по умолчанию. Почему это проблема? Я заметил, что каждый символ в консоли привязан не к цвету, а к индексу цветовой палитры, поэтому после восстановления палитры по умолчанию я также восстановил wchar_t цвет. После удаления этой строки я буду мешать остальной части кода. Есть ли способ заблокировать символ x, y в консоли, чтобы избежать изменения цвета? Из важных вещей я использую Visual Studio и, как вы можете догадаться, я использую windows.

1 Ответ

0 голосов
/ 01 апреля 2020

Нет.

Вы сказали это сами: вам доступно 16 цветов.

Когда вы думали, что обойдете это ограничение, на самом деле все, что вы делали, это меняло эти цвета. «среднее», то есть с какими значениями RGB они сопоставляются для этой консоли.

Текущая палитра применяется ко всему содержимому консоли. Если этого не произойдет, мы не будем ограничены 16 цветами.

Так что, хотя ваша попытка является изобретательной, я боюсь, что она принципиально не сработает.

Если вы хотите контролировать настоящие цвета, как это, создайте приложение GUI.

...