c ++ - Brug WriteConsoleOutputCharacter og SetConsoleTextAttribute

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at skrive et program, der udsender via koordinater. Jeg bruger windows.h inkluderer, og funktionen WriteConsoleOutputCharacter til at udskrive tegn til skærmen, men det ignorerer farvemængden fra SetConsoleTextAttribute. Er der nogen ideer, hvordan man får det til at få output i farve?


Kode, der udsender til konsollen:


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();
}


Og maling kalder i grunden en malingfunktion i min Colorizer klasse med den passende farve
Colorizer maling funktion (kaldet af maling () og unpain ():


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


\_con er håndtaget, indstillet via \_con = GetStdHandle(STD\_OUTPUT\_HANDLE);

Bedste reference


Det er modstykket til WriteConsoleOutputAttribute (). Man skriver et tegn, men ændrer ikke attributten. Den anden skriver attributten, men ændrer ikke tegnet.


Brug WriteConsole () i stedet.

Andre referencer 1


Som foreslået af Hans Passant på https://stackoverflow.com/a/9275247/15485 kan du matche WriteConsoleOutputCharacter med WriteConsoleOutputAttribute.


Indtast billedbeskrivelse her [10]


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