Cómo cambiar el color de la consola en C++

Jinku Hu 11 diciembre 2023
  1. Usar los códigos de escape ANSI para cambiar el color de la consola
  2. Use el método SetConsoleTextAttribute() para cambiar el color de la consola en C++
Cómo cambiar el color de la consola en C++

Este artículo explicará varios métodos de cómo cambiar el color de la consola en C++.

Usar los códigos de escape ANSI para cambiar el color de la consola

Dado que los colores no forman parte de la biblioteca estándar de C++ y que las características específicas de la consola son manejadas en su mayoría por los sistemas operativos, no hay ninguna característica de lenguaje nativo para añadir colores a los flujos de salida. Aunque, discutimos algunas formas específicas de plataforma para manejar la coloración de la salida de texto.

Los códigos de escape ANSI son una forma relativamente portátil de resolver este problema. Los códigos de escape son secuencias de bytes que comienzan mayormente con un carácter de escape ASCII y un carácter de paréntesis seguido de parámetros. Estos caracteres están incrustados en el texto de salida, y la consola interpreta las secuencias como comandos en vez de como texto a mostrar. Los códigos ANSI incluyen múltiples formatos de color, cuyos detalles completos pueden verse en esta página. En el siguiente ejemplo de código, demostramos la definición de varios caracteres de color como macros y más tarde incluimos estos símbolos en los argumentos de la cadena printf. Fíjate en que printf concatena múltiples cadenas de doble cita pasadas en el primer lugar del parámetro.

#include <iostream>

#define NC "\e[0m"
#define RED "\e[0;31m"
#define GRN "\e[0;32m"
#define CYN "\e[0;36m"
#define REDB "\e[41m"

using std::cout;
using std::endl;

int main(int argc, char *argv[]) {
  if (argc < 2) {
    printf(RED "ERROR" NC
               ": provide argument as follows -> ./program argument\n");
    exit(EXIT_FAILURE);
  }
  printf(GRN "SUCCESS!\n");

  return EXIT_SUCCESS;
}

Salida (sin el argumento de programa):

ERROR: provide argument as follows -> ./program argument

Salida (con el argumento de programa):

SUCCESS!

Alternativamente, los mismos códigos de escape pueden ser usados con una llamada cout. Note que no es necesario usar el operador de inserción de cadenas << varias veces y sólo combinar los símbolos de macro en conjunción con los literales de las cadenas ya que se combinarán automáticamente.

#include <iostream>

#define NC "\e[0m"
#define RED "\e[0;31m"
#define GRN "\e[0;32m"
#define CYN "\e[0;36m"
#define REDB "\e[41m"

using std::cout;
using std::endl;

int main() {
  cout << CYN "Some cyan colored text" << endl;
  cout << REDB "Add red background" NC << endl;
  cout << "reset to default colors with NC" << endl;

  return EXIT_SUCCESS;
}

Resultado:

Some cyan colored text
Add red background
reset to default with NC

Use el método SetConsoleTextAttribute() para cambiar el color de la consola en C++

SetConsoleTextAttribute es el método del API de Windows para establecer los colores del texto de salida usando diferentes parámetros. Esta función establece los atributos de los caracteres escritos en el búfer de la pantalla de la consola por las funciones WriteFile o WriteConsole. La descripción completa de los atributos de los caracteres se puede ver en esta página.

#include << windows.h>>

#include <iostream>
#include <string>

using std::cout;
using std::endl;

int main() {
  std::string str("HeLLO tHERe\n");
  DWORD bytesWritten = 0;

  HANDLE cout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(console_handle,
                          FOREGROUND_RED | BACKGROUND_INTENSITY);
  WriteFile(cout_handle, str.c_str(), str.size(), &bytesWritten, NULL);

  return EXIT_SUCCESS;
}

Resultado:

Some red colored text
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ IO