Использование WriteConsoleOutputCharacter и SetConsoleTextAttribute - PullRequest
2 голосов
/ 14 февраля 2012

Я пытаюсь написать программу, которая будет выводить через координаты. Я использую windows.h include и функцию WriteConsoleOutputCharacter для печати символов на экране, однако он игнорирует цвет, установленный SetConsoleTextAttribute. Любые идеи, как заставить его выводить в цвете?

Вывод кода на консоль:

void Card::printFancy(COORD coord, bool top) const
{
    paint();
    LPDWORD written(0);
    for (int row(0); row < CARD_WIDTH; ++row)
    {
        coord.Y += 1;
        WriteConsoleOutputCharacter(Colorizer::getInstance().getCon(), _card[row], CARD_WIDTH, coord, written);
    }
    unpaint();
}

И paint в основном вызывает функцию paint в моем классе Colorizer с соответствующим цветом Функция рисования Colorizer (вызывается с помощью paint () и unpain ():

void paint(uint color)
{
    SetConsoleTextAttribute(_con, color);
}

_con - ручка, устанавливается через _con = GetStdHandle(STD_OUTPUT_HANDLE);

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Это аналог WriteConsoleOutputAttribute ().Один пишет персонаж, но не меняет атрибут.Другой записывает атрибут, но не меняет символ.

Вместо этого используйте WriteConsole ().

0 голосов
/ 25 сентября 2017

В соответствии с предложением Ганс Пассант в https://stackoverflow.com/a/9275247/15485 вы можете сопоставить WriteConsoleOutputCharacter с WriteConsoleOutputAttribute.

enter image description here

#include <windows.h>
#include <stdio.h>

void write_symbol_in_color(HANDLE h, SHORT x, SHORT y, const char* symbol, WORD color)
{
   COORD here;
   here.X = x;
   here.Y = y;

   WORD attribute = color;
   DWORD written;
   ::WriteConsoleOutputAttribute(h, &attribute, 1, here, &written);
   ::WriteConsoleOutputCharacterA(h, symbol, 1, here, &written);
}

int main()
{
   HANDLE hStdOut = ::GetStdHandle(STD_OUTPUT_HANDLE);
   if (hStdOut == INVALID_HANDLE_VALUE)
   {
      printf("Invalid handle");
      return 1;
   }

   write_symbol_in_color(hStdOut, 0, 0, "R", FOREGROUND_RED | FOREGROUND_INTENSITY);
   write_symbol_in_color(hStdOut, 1, 0, "G", FOREGROUND_GREEN | FOREGROUND_INTENSITY);
   write_symbol_in_color(hStdOut, 2, 0, "B", FOREGROUND_BLUE | FOREGROUND_INTENSITY);
   write_symbol_in_color(hStdOut, 3, 0, "C", FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
   write_symbol_in_color(hStdOut, 4, 0, "M", FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
   write_symbol_in_color(hStdOut, 5, 0, "Y", FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);

   return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...