[C/C++]Farbiger Text

baigox

Mitglied
Hi

Problem:Ich möchte wissen, wie ich bei einzelne Zeichen die Farbe ändern kann.

wenn ich im Konsolenfenster z.b. ausgeben möchte:
----------
 
Hallo,

in meinem Falle wäre ncurses totaler overkill gewesen, deshalb hab ich eine Wrapper-Methode für die Ausgabe gemacht. Ich musste halt eine Lösung für Windows und Linux machen, Mac war nicht gefordert.
Weiß nicht, ob es dir hilft, aber so hab ich das damals gelöst:
C++:
/*
 * output.cpp
 * Some methods responsible to print out messages to the user
*/
#include <cstdlib>
#include <iostream>
#include <cstring>

#include "output.h"

#ifdef IS_WINDOWS
  #include <windows.h>
#endif  // Compile for Windows

using namespace std;

void message(const char* format, ...) {
  if(quiet) return;
  va_list argp;
  va_start(argp, format);

  cout << NAME << ": ";
  writeText(&cout, format, &argp);
  cout << endl;
}

void error(const char* format, ...) {
  if(super_quiet) return;
  va_list argp;
  va_start(argp, format);

  cerr << NAME << ": ";

#ifdef IS_WINDOWS
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
  writeText(&cerr, format, &argp);
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
#else
  cerr << "\033[0;31m";
  writeText(&cerr, format, &argp);
  cerr << "\033[0m" << endl;
#endif
}

void writeText(ostream* stream, const char* format, va_list* argp) {
  int val_i;
  char* val_c;

  while(*format != '\0') {
    if(*format == '%') {
      format++;
    
      switch(*format) {
        case 'i':
          val_i = va_arg(*argp, int);
          val_c = new char[32];
          snprintf(val_c, 32, "%i", val_i);
          break;
        case 'c':
          val_c = va_arg(*argp, char*);
          break;
        default:
          val_c = new char[2];
          val_c[0] = *format;
          val_c[1] = '\0';
      }

      (*stream).write(val_c, strlen(val_c));
    } else {
      (*stream).put(*format);
    }

    format++;
  }

  (*stream).flush();
  return;
}

Hier wurden Fehlermeldungen rot gedruckt und normale Nachrichten halt in der Standardfarbe. Die Konstante IS_WINDOWS hab ich mir in einer Headerdatei wie folgt definiert:
C++:
#if defined(_WIN32) || defined(_WIN64) || defined(_MSDOS)
  #define IS_WINDOWS
#endif

Gruß
BK
 
unter Linux gibts folgende Möglichkeit:
(mit stdio.h)

\033["x"m

wobei das x für die Eigenschaften steht...

unter http://en.wikipedia.org/wiki/ANSI_escape_code#Codes
in der Tabelle "SGR (Select Graphic Rendition) parameters"

findest du die Ziffern der Eigenschaften...
mit 30+ (1 bis 7 für die Farben) legst du die Farbe fest.
benutz die kleine Farbtabelle darunter für die Farben...

mehrere Eigenschaften grenzt du mit ; ab.
um den Standart wieder zurückzusetzen schreibst du \033[0m

das heißt also im Beispiel:

wenn ich den Buchstaben O der Wortes ROT auch rot färben will würde das so aussehen:

printf("R\033[31mO\033[0mT");

wenns in einem hellen Magenta und unterstrichen sein soll würde es so aussehen:

printf("R\033[1;4;35mO\033[0mT");
dabei steht die 1 für "hell"
4 für "unterstrichen"
und 35 für die Farbe Magenta

ich weiß nicht welchen Editor du benutzt...
ich benutze gedit in Ubuntu und es wird nur die /033 formatiert.
aber lass dich von dem merkwüridem Aussehen nicht stören...
nach dem Compelieren und ausführen der Datei ist es wie gewollt...
zumindest funktionierts bei mri :)

ich hoffe das war deine Frage?!
 
Also ich blick da gar nich durch.
ich wollte nur mein Spiel etwas bunter gestalten.
Könnt ihr vielleicht eine headerdatei zusammenbasteln, mit nem befehl, der wie cout funktioniert, nur dass man vorher noch die Farbe angibt.z.B.
cout "FF0000" << HELLO;
cout "00FF00" << WORLD;
cout "0000FF" << !.!;
Man sieht : HELLO WORLD !.!

Ach ja
ich benutze Windows mit Dev-cpp

EDIT:
Oh, post als ich geschrieben habe
Mit dem printf(); probier ich gleich mal aus
EDIT2:
Das geht nicht bei mir
 
Zuletzt bearbeitet:
Hi.

Bsp:
C++:
#include <iosfwd>

#if defined(_WIN32) && !defined(__CYGWIN__)
#  include <windows.h>

struct fgcolor {
  enum fgcolor_enum_t {
    black = 0,
    blue  = FOREGROUND_BLUE,
    green = FOREGROUND_GREEN,
    red   = FOREGROUND_RED,
    white = blue | green | red,
    cyan  = blue | green,
    ...
    high  = FOREGROUND_INTENSITY
  };
};

struct bgcolor {
  enum bgcolor_t {
    black = 0,
    blue  = BACKGROUND_BLUE,
    green = BACKGROUND_GREEN,
    red   = BACKGROUND_RED,
    ...
    high  = BACKGROUND_INTENSITY
  };
};

#else
#  error "sorry, not yet implemented"
#endif

struct _setcolor { int c; };

inline
_setcolor
setcolor(int c) {
  _setcolor r = { c };
  return r;
}

#include <iostream>

inline
std::ostream& operator<< (std::ostream& out, _setcolor color) {
  HANDLE hStdout = ::GetStdHandle(STD_OUTPUT_HANDLE); 
  if (!::SetConsoleTextAttribute(hStdout, color.c))
    // hm, that didn't work.
    std::cerr << "error: " << ::GetLastError() << std::endl;

  return out;
}


int main(int argc, char *argv[])
{
  std::cout << setcolor(fgcolor::red | bgcolor::green | bgcolor::high)
	    << "Hallo,"
	    << setcolor(fgcolor::red) << "welt" << std::endl;
  std::cin.get();
  return 0;
}
Gruß
 
Zuletzt bearbeitet:
Danke deepthroat
es hat fuktioniert.
ich strebe nach mehr wissen:
wie kann ich neue Farben definieren?
also, was kann ich anstadt den "..." einfügen
 
Zurück