domingo, 1 de mayo de 2011

Consola con colores en C++

Tal vez se habrán dado cuenta que mostrar un mensaje en color en consola, no es algo trivial en C++... C++ no incluye funciones propias para hacer esto, ya que "colorear" la consola es algo dependiente del sistema operativo. Tampoco hay alguna manera relativamente sencilla, que podamos decir "bueno, haciendo esto tengo las letras en colores"... Por ejemplo, en Windows esto se logra sólo con llamadas a la API de Windows (usando arreglos de memoria que contienen atributos de color y caracteres, llamados "Console Screen Buffers"). En Linux, existen los llamados códigos ANSI, que son una secuencia de caracteres ASCII que actúan como funciones para poder cambiar estos atributos.
Para simplicarles las cosas, hice esta pequeña librería (basándome en código que encontré por Internet) que engloba y unifica estas diferencias, de tal manera de hacerla independiente de la plataforma con tal de poder incluirla en programas de Windows o Linux con un uso común.
Es un simple archivo .h, que define los colores para pasárselos al cout de la siguiente forma:

cout<<color<<"texto de prueba";

Los colores disponibles son los siguientes:
black (negro), red (rojo), green (verde), yellow (amarillo), blue (azul), magenta (magenta), cyan (cian), white (blanco), normal (volver al color por defecto), blackb (negro en negrita), redb (rojo en negrita), greenb (verde en negrita), yellowb (amarillo en negrita), blueb (azul en negrita), magentab (magenta en negrita), cyanb (cian en negrita), whiteb (blanco en negrita), normalb (volver al color por defecto en negrita).

Es decir que si por ejemplo queremos mostrar un mensaje como el siguiente:

Mensaje con muchos colores

se debería escribir:

cout<<red<<"Mensaje "<<yellow<<"con "<<green<<"muchos "<<blueb<<"colores"<<normal;

Como en Windows no se puede especificar un atributo "negrita" para la consola, las versiones en negrita de los colores tienen una intensidad diferente de las versiones normales. En las siguientes imágenes se ven las diferencias entre Windows y Linux (código de ejemplo):

consola de Windows
consola de Linux


Para compilar, hay que definir la macro WIN si están en Windows, o LINUX si están en Linux. De esta forma se usa el código correspondiente dependiendo de la plataforma elegida.
Esto se hace con la opción -D de g++, por ejemplo:

g++ -o colores colores.cpp -DLINUX

Por ahora como se habrán dado cuenta sólo permite cambiar el color de frente y no el de fondo. A lo mejor en algún momento la amplíe incluyéndole esta funcionalidad.

La pueden descargar de acá: concolor.h

10 comentarios:

  1. hola mira esta viendo lo q hiciste y me resulto de mucha ayuda pero me gustaria si podrias decirme como definir y donde definir el sitema operativo, desde ya muhcas gracias y gran trabajo felicidades!!!!

    ResponderEliminar
  2. Hola Jhony Soy Duvan y necesito tu ayuda, estoy usando la libreria, pero no he podido definir el sistema operativo como lo haces uso CODE::BLOCKS

    ResponderEliminar
  3. Hola Jhony Soy Duvan y necesito tu ayuda, estoy usando la libreria, pero no he podido definir el sistema operativo como lo haces uso CODE::BLOCKS

    ResponderEliminar
    Respuestas
    1. No uso CODE::BLOCKS pero debés buscar en las opciones del mismo dónde pasarle parámetros personalizados al compilador, y ahí agregarle el SO con el -D.

      Eliminar
  4. Hola johny, me gustó mucho lo que vi en el post asi que quize descargarlo pero el link esta caido...

    ResponderEliminar
  5. Hola Johny me podrias dar el link para descargar el ejemplo es que el link esta roto

    ResponderEliminar
  6. Muy bueno si funciona solo que yo tuve que cambiar #ifdef WIN por WINDOWS_KEY_WORD

    ver la siguiente url https://stackoverflow.com/questions/6649936/c-compiling-on-windows-and-linux-ifdef-switch

    ResponderEliminar