Изменить весь цвет фона консоли (Win32 C ++) - PullRequest
8 голосов
/ 24 июня 2011

Как я могу изменить цвет фона всей консоли? Я пробовал SetConsoleTextAttribute, и он только меняет цвет фона нового текста.

Я хочу, чтобы вся консоль покраснела при возникновении серьезной ошибки.

Спасибо всем, кто пытается помочь.

Ответы [ 6 ]

4 голосов
/ 24 июня 2011

Я думаю, что функция FillConsoleOutputAttribute сделает то, что вам нужно.Установите его в качестве начальной координаты консоли, а в nLength укажите количество символов в консоли (width * length).

BOOL WINAPI FillConsoleOutputAttribute(
  __in   HANDLE hConsoleOutput,
  __in   WORD wAttribute,
  __in   DWORD nLength,
  __in   COORD dwWriteCoord,
  __out  LPDWORD lpNumberOfAttrsWritten
);
2 голосов
/ 27 января 2016

Я знаю, что это старый вопрос, но как насчет этого кода:

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

Насколько я знаю, этот код должен работать в Windows Vista и более поздних версиях.Кстати, этот код основан на этой статье (в основном источники на этой статье): http://cecilsunkure.blogspot.fi/2011/12/windows-console-game-set-custom-color.html

2 голосов
/ 24 июня 2011

Попробуйте что-то вроде:

system("color c2");
0 голосов
/ 23 мая 2019

У меня есть грязный путь здесь, но дает то, что вы точно хотите.

  #include <windows.h>
  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(hConsole,30);
  system("CLS");

Консоль

0 голосов
/ 10 октября 2017

Это можно сделать, и для всего фона можно установить желаемый цвет с помощью SetConsoleScreenBufferInfoEx .Приведенный ниже код не должен связываться с предыдущим выводом на консоль, особенно если используются цвета:

 #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;
    }
0 голосов
/ 12 мая 2013

Это работает для меня.Он изменяет цвет фона, не изменяя цвет переднего плана уже отображаемого текста, изменяя каждую ячейку символа консоли по одному.Вам нужно будет получить дескриптор буфера вывода консоли, что, как я считаю, делается с помощью 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);
    }
}
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...