Kann ich die Hintergrundfarbe des Terminals ändern, ohne die vorgegebenen Farben nutzen zu müssen? Gibt es eine OS-spezifische Lösung?

  • C++

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Bartosz.

    Kann ich die Hintergrundfarbe des Terminals ändern, ohne die vorgegebenen Farben nutzen zu müssen? Gibt es eine OS-spezifische Lösung?

    Hallo,
    ich habe mich gerade gefragt, ob ich die Hintergrundfarbe einer Konsole ändern kann, und ich rede nicht von den 16 vorgegebenen Farben. Ich glaube, in portablem C++Code wird das nicht möglich sein, daher die Frage, ob ihr eine OS-spezifische Lösung kennt.
    Ich nutze Win10 (64bit).

    Viele Grüße
    Bartosz

    @Bartosz Was ist denn der Output dieses Color-Dialogs?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo @RodFromGermany Das Fenster, das du im Bild siehst, ist der Eigenschaften-Dialog meiner Konsole der aktuellen C++ Anwendung. Der Farbdialog da bietet mir die 16 Standard-Farben an. Diese möchte ich nicht haben. Daher frage ich mich, ob ich weitere Farben erzeugen kann, via eines Befehls. Im Internet stehen nur Lösungen, die vorgegebenen Farben zu kombinieren etc

    Edit: ich rede auch nicht von
    SetConsoleTextAttribute()
    @Bartosz Was ist der Output dieses DialogsTß
    Welchen Datentyp hat dieser Output?
    Wenn es kein Enum ist, sollte das kein Problem sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany So wie ich das erlesen habe, vom Typ RGB. Ich habe gerade diesen Code gefunden

    C-Quellcode

    1. CONSOLE_SCREEN_BUFFER_INFOEX info;
    2. info.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
    3. HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    4. GetConsoleScreenBufferInfoEx(hConsole, &info);
    5. info.ColorTable[0] = RGB(255, 187, 0);
    6. info.ColorTable[1] = RGB(0, 0, 0);
    7. SetConsoleScreenBufferInfoEx(hConsole, &info);
    8. SetConsoleTextAttribute(hConsole, 1);
    9. std::cout << "Hello World!" << std::endl;

    und jetzt sieht es so aus:

    Naja, die Hintergrundfarbe entspricht dem angegebenen RGB-Wert, ja. Die Vordergrundfarbe auch, ja. Aber der Rest der Konsole bleibt noch weiß. Also das ist keine gute Lösung...

    Bartosz schrieb:

    Aber der Rest der Konsole bleibt noch weiß.
    Da sollte es doch einen ClearScreen-Befehl geben,
    oder
    Du beschreibst die komplette Console mit Leerzeichen und setzt den Ausgabe-Pointer wieder zurück.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe es geschafft!

    C-Quellcode

    1. //Farben
    2. CONSOLE_SCREEN_BUFFER_INFOEX info{};
    3. info.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
    4. HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    5. GetConsoleScreenBufferInfoEx(hConsole, &info);
    6. info.ColorTable[0] = RGB(255, 253, 153);
    7. info.ColorTable[1] = RGB(0, 0, 0);
    8. SetConsoleScreenBufferInfoEx(hConsole, &info);
    9. SetConsoleTextAttribute(hConsole, 1);
    10. //std::cout << "Hello World!" << std::endl;
    11. HANDLE Con_Out = GetStdHandle(STD_OUTPUT_HANDLE);
    12. CONSOLE_SCREEN_BUFFER_INFO ScreenBuf;
    13. GetConsoleScreenBufferInfo(Con_Out, &ScreenBuf);
    14. system("color 01");


    Unter dem von Stackoverflow kopierten Code muss man noch system("color 01") schreiben, damit die ganze Konsole gefüllt wird. 01, weil ich habe ja ColorTable[0] und [1] überschrieben.

    Die Lösung von eben (siehe meine vorherige Nachricht) wäre mir auch nicht genug. Dann macht das Ganze ja keinen Sinn.

    Du beschreibst die komplette Console mit Leerzeichen und setzt den Ausgabe-Pointer wieder zurück.
    Habe ich auch getestet, einfach mal die Buffergröße der Konsole herausfinden und das dann so oft mit " " in die Konsole schreiben und dann den Cursor wieder auf (0/0) setzen. Dann schrieb das Programm jedoch nicht mehr drüber. Das heißt, danach ein std::cout geschriebener Text war nicht mehr erkennbar.
    Es gibt noch was mega cooles

    gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797

    ich weiß nur nicht wie es sich in Windows verhält, denn im Debug war alles okay, aber im Release wollte es die Funktionen nicht mehr erkennen :/