Meine output-funktion gibt nichts Farbiges aus :(



  • Hi
    Ich habe eine Funktion geschrieben, die ein Zeichen an einer bestimmten stelle ausgibt. allerdings wird IMMER in Grau, mit schwartzem background ausgegeben

    Meine output-Funktion:

    void coutput(char value, int x, int y)
    {
    COORD WriteCoord;
    DWORD dwNumberOfCharsWritten = 1;
    
       WriteCoord.X = x;
       WriteCoord.Y = y;
    
    FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), value, 1, WriteCoord, &dwNumberOfCharsWritten);
    }
    

    Die textcolor-Funktion:

    void mytextcolor(int newcolor)
    {
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    HANDLE                     hOutput;
    
      if(INVALID_HANDLE_VALUE == (hOutput = GetStdHandle(STD_OUTPUT_HANDLE))) return;
      if(!GetConsoleScreenBufferInfo(hOutput, &csbi)) return;
    
    SetConsoleTextAttribute(hOutput, (WORD)((csbi.wAttributes & ~0x0F) | ((WORD)(newcolor & 0x0F))));
    
    return;
    }
    

    Und so soll's aufgeruden werden:

    mytextcolor(14);
    coutput('x', 10, 15);
    

    Es sollte an der Position 10/15 ein gelbes 'x' ausgeben, aber er wird nur ein graues ausgegen 😞



  • Wenn du FillConsoleOutputCharacter verwendest, werden deine aktuellen Textattribute ignoriert. Entweder musst du hinterher mit FillConsoleOutputAttribute die Zeichen entsprechend einfärben oder du verwendest iostreams, bei denen dann die aktuellen Textattribute genutzt werden. Hast du eine normale Konsolenanwendung kompiliert, so kannst du normal cout benutzen, wenn du die Konsole selbst mit AllocConsole erstellt hast, kannst du die Standardausgabe so dorthin umleiten:

    freopen("CON","w",stdout);
    	freopen("CON","r",stdin);
    


  • Ich suche eigentlich nur nach schnelleren (und besseren) Funktion, für die Konsole
    Aber gut, dasses schonmal nicht an meiner Funktion liegt 😉
    Danke, für dern Hinweis.



  • Schneller als was?



  • Uhrstpünglich schneller als "cout"
    Aber jetzt isses im Pronzip mehr der spaß daran, mit der Winapi zu arbeiten, und eigene Funktionen zu schreiben.

    Die Geschwindigkeits-probleme lassen sich ja mit "SetThreadPriority" lösen



  • RedEagle schrieb:

    Die Geschwindigkeits-probleme lassen sich ja mit "SetThreadPriority" lösen

    Hmm, ob das wohl die beste Möglichkeit ist!? 😃

    Naja, wenn du das mit deiner Funktion machen willst, musst du jedenfalls direkt nach dem Aufruf von FillConsoleOutputCharacter nochmal FillConsoleOutputAttribute aufrufen, dann hast du das gewünschte Ergebnis. In den FAQ gibt es übrigens einen Beitrag "Improved Console", dort ist eine Klasse gepostet, die die Möglichkeiten der Konsole durch Nutzung der WinAPI-Funktionen demonstriert.


Anmelden zum Antworten