10
votes

Changer la couleur de fond de la console complète (Win32 C ++)

Comment puis-je modifier la couleur de fond de la console entière? J'ai essayé SetConsoletextatTtribute et modifie uniquement la couleur d'arrière-plan du nouveau texte.

Je veux effectivement que toute la console soit rouge en rouge lorsqu'une erreur grave apparaît.

Merci à tous ceux qui tentent d'aider.


4 commentaires

Sons comme il est tâche facile en C # , mais en C ++ ..: | N'a rien trouvé sur une google rapide. Peut-être juste définir le fond de texte sur le rouge et imprimer une gamme complète de caractères, principalement avec votre texte à l'intérieur, également sur fond rouge? Je pense que cela pourrait être qualifié de solution de contournement.


Ceci est trivial dans la langue de commande Windows: couleur 4f , et c'est tout. :-)


@Alf: ce qui signifie que cela pourrait fonctionner: Système ("CMD / C \" Couleur 4F \ "") .


@Loadmaster qui fonctionne bien. Je sais que ce n'est généralement pas recommandé, pas portable, etc., mais je pense que c'est ma seule option à ce stade. Sauf si je pouvais comprendre comment faire la même chose que la couleur est en C ++ (ce que je suis sûr est possible).


7 Réponses :


5
votes

Je pense que le FillconsOolOutputtatRibute < / Code> fonction va faire ce dont vous avez besoin. Définissez-le à la coordonnée de démarrage de la console et définissez nlength au nombre de caractères de la console ( Landth * longueur ). XXX < / p>


2 commentaires

Très proche, mais les cellules qui contiennent déjà des caractères restent la couleur de fond précédente.


Devinez ma Win32 / Console est un peu rouillée. Pouvez-vous essayer WriteConSoleOutputtatRibute ? Cela pourrait être ce que vous cherchez.



5
votes

Essayez quelque chose comme: xxx


3 commentaires

+1 simple mais efficace même s'il est plus lent d'utiliser un appel système .


J'ai fini par aller avec ça. J'aurais préféré une fonction API, mais c'est si simple et fonctionne bien.


Ca ne fonctionne pas ! Il modifie la couleur de la couleur du texte et la couleur de fond de texte, pas de couleur de console entière



0
votes

Cela fonctionne pour moi. Il modifie la couleur d'arrière-plan sans gâcher la couleur de premier plan du texte déjà affichée, en modifiant chaque cellule de caractères de la console, une à la fois. Vous devrez obtenir la poignée à votre mémoire tampon de sortie de la console, ce que je crois est fait avec getStdhandle () .

DWORD written = 0;
COORD writeCoord = {0};
WORD attribute;
for (int y = 0; y < consoleBufferLength; y++)     // rows
{
    for (int x = 0; x < consoleBufferWidth; x++)  // columns
    {
        writeCoord.X = x; writeCoord.Y = y;
        ReadConsoleOutputAttribute(consoleOutputHandle, &attribute, 1, writeCoord, &written);
        attribute &= 0xFF0F;  // zero the background color
        attribute |= 12 << 4; // change the background color to red
        FillConsoleOutputAttribute(consoleOutputHandle, attribute, 1, writeCoord, &written);
    }
}


0 commentaires

3
votes

Je sais que c'est une ancienne question, mais que diriez-vous de ce code:

#include <windows.h>
#include <iostream>


VOID WINAPI SetConsoleColors(WORD attribs);


int main() {

    SetConsoleColors(BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);

    std::cout << "Hello, world!" << std::endl;
    std::cin.get();

    return 0;
}


VOID WINAPI SetConsoleColors(WORD attribs) {
    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

    CONSOLE_SCREEN_BUFFER_INFOEX cbi;
    cbi.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
    GetConsoleScreenBufferInfoEx(hOutput, &cbi);
    cbi.wAttributes = attribs;
    SetConsoleScreenBufferInfoEx(hOutput, &cbi);
}


1 commentaires

Pour une raison quelconque, cette solution provoque une rétrécie de la fenêtre de ma console chaque changement de couleur



1
votes

Il peut être fait et tout l'arrière-plan peut être défini sur la couleur désirée avec SETCONSORECREENBUTINGERINFOEX . Le code ci-dessous ne doit pas gâcher la sortie de la console précédente, surtout s'il utilisait les couleurs:

 #include "Windows.h"

    void FlashConsoleBackgroundColor(int cntFlashes, int flashInterval_ms, COLORREF color)
    {

        CONSOLE_SCREEN_BUFFER_INFOEX sbInfoEx;
        sbInfoEx.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);

        HANDLE consoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
        GetConsoleScreenBufferInfoEx(consoleOut, &sbInfoEx);

        COLORREF storedBG = sbInfoEx.ColorTable[0];

        for (int i = 0; i < cntFlashes; ++i)
        {
            //-- set BG color
            Sleep(flashInterval_ms);
            sbInfoEx.ColorTable[0] = color;
            SetConsoleScreenBufferInfoEx(consoleOut, &sbInfoEx);

            //-- restore previous color
            Sleep(flashInterval_ms);
            sbInfoEx.ColorTable[0] = storedBG;
            SetConsoleScreenBufferInfoEx(consoleOut, &sbInfoEx);
        }
    }

    int main()
    {

        printf("Flashing console BG: RED");
        FlashConsoleBackgroundColor(20, 50, RGB(255, 0, 0));

        printf("\rFlashing console BG: ORANGE\n");
        FlashConsoleBackgroundColor(10, 100, RGB(255, 105, 0));

        return 0;
    }


2 commentaires

Comment cette réponse est-elle différente de: la réponse de @ Magetzub ci-dessus? Ils montrent tous les deux comment utiliser getconsolescreenbufferinfoex et setConsolescreenbufferinfoex Seule votre réponse semble être inutilement plus complexe.


En fait, mon code est assez différent dans la fonctionnalité, même s'il a l'air similaire. @ Le code de Magetzub modifie la couleur de premier plan et de fond de tous les caractères ayant les mêmes attributs que la dernière ligne imprimée. Si vous n'avez pas utilisé SETCONSOLETEXTTTRIBUT avant cela, la totalité des antécédents change. Toutefois, ajouter avant: setConsoletextatTtribute (getStdhandle (std_output_handle), 0x96); printf ("Quelques prises de console précédentes \ n"); .. et il échoue. Mon exemple change une seule couleur, la couleur de l'arrière-plan, quel que soit ce qui a été imprimé avant. Également en bonus, vous pouvez la définir sur la personnalisation RVB.



0
votes

J'ai une solution sale ici, mais donne ce que tu veux exactement. xxx

console


0 commentaires

1
votes
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(out, 0x9 | 0x70); 
// text color from 0x1-0x9
// text background color from 0x10-0x90   
system("color d1");
/*
Sets the default console foreground and background colors     
COLOR [attr]      
attr        Specifies color attribute of console output       
Color attributes are specified by TWO hex digits -- the first
corresponds to the background; the second the foreground.  Each digit
can be any of the following values:       
            0 = Black       8 = Gray
            1 = Blue        9 = Light Blue
            2 = Green       A = Light Green
            3 = Aqua        B = Light Aqua
            4 = Red         C = Light Red
            5 = Purple      D = Light Purple
            6 = Yellow      E = Light Yellow
            7 = White       F = Bright White
If no argument is given, this command restores the color to what it was
when CMD.EXE started.  This value either comes from the current console
window, the /T command line switch or from the DefaultColor registry
value.       
The COLOR command sets ERRORLEVEL to 1 if an attempt is made to execute
the COLOR command with a foreground and background color that are the
same.
/*

0 commentaires