Hvordan udskrives farvet tekst i C ++ med kodeblocks på Windows?

Indlæg af Hanne Mølgaard Plasc

Problem




   Mulig duplikat:

  Farver stdout output til Windows cmd.exe fra konsol C ++ app





Jeg bruger kodeblocks på Windows XP, og jeg har brug for en måde at udskrive farvet tekst på, og måske ændre farven på baggrunden også i en konsolprogram.

Jeg forsøgte conio.h funktionerne, men de synes ikke at være kompatible med kodeblokke.

Bedste reference


Det lader til, at du vil bruge nogle Windows API-funktioner til at opnå dette.

Hvis du brugte Cygwin til Windows, ville det være lidt lettere.


Her er et eksempel på tak til daniweb: [7]


// color your text in Windows console mode
// colors are 0=black 1=blue 2=green and so on to 15=white
// colorattribute = foreground + background * 16
// to get red text on yellow use 4 + 14*16 = 228
// light red on yellow would be 12 + 14*16 = 236
// a Dev-C++ tested console application by vegaseat 07nov2004

#include <iostream>
#include <windows.h> // WinApi header

using namespace std; // std::cout, std::cin

int main()
{
    HANDLE hConsole;
    int k;

    hConsole = GetStdHandle(STD\_OUTPUT\_HANDLE);

    // you can loop k higher to see more color choices
    for(k = 1; k < 255; k++)
    {
        // pick the colorattribute k you want
        SetConsoleTextAttribute(hConsole, k);
        cout << k << " I want to be nice today!" << endl;
    }

    cin.get(); // wait
    return 0;
}

Andre referencer 1


Dette stykke kode kan hjælpe:


WinConsole.h


#pragma once

typedef void* HANDLE;

class WinConsole
{
public:
    WinConsole(void);
    ~WinConsole(void);

    void SetColour(WORD colour);

    WORD GetDefaultColour() const;

    void Reset();
private:
    HANDLE fConsoleHandle;
    CONSOLE\_SCREEN\_BUFFER\_INFO fDefaultScreenBufferInfo;
};


WinConsole.cpp


#include "WinConsole.h"
#define WIN32\_LEAN\_AND\_MEAN
#define <Windows.h>

WinConsole::WinConsole(void)
{
    fConsoleHandle = ::GetStdHandle(STD\_OUTPUT\_HANDLE);
    if (INVALID\_HANDLE\_VALUE != fConsoleHandle)
    {
        ::GetConsoleScreenBufferInfo(fConsoleHandle, &fDefaultScreenBufferInfo);
    }
}

WinConsole::~WinConsole(void)
{
}

void WinConsole::SetColour( WORD colour )
{
    if (INVALID\_HANDLE\_VALUE != fConsoleHandle)
    {
        ::CONSOLE\_SCREEN\_BUFFER\_INFO info = { sizeof(CONSOLE\_SCREEN\_BUFFER\_INFO), 0 };
        if(::GetConsoleScreenBufferInfo(fConsoleHandle, &info))
        {
            ::SetConsoleTextAttribute(fConsoleHandle, (info.wAttributes & 0xff00)|colour);
        }
    }
}

void WinConsole::Reset()
{
    if (INVALID\_HANDLE\_VALUE != fConsoleHandle)
    {
        ::SetConsoleTextAttribute(fConsoleHandle, fDefaultScreenBufferInfo.wAttributes);
    }
}

WORD WinConsole::GetDefaultColour() const
{
    if (INVALID\_HANDLE\_VALUE != fConsoleHandle)
    {
        return (WORD)(fDefaultScreenBufferInfo.wAttributes & 0x00ff);
    }
    return e\_FGRed | e\_FGGreen | e\_FGBlue;
}


Anvendelse:


WinConsole console;
console.SetColour(FOREGROUND\_RED|BACKGROUND\_BLUE); // Superman style ;)