Zwei Konsolebuffer



  • Hi ihr!

    Ich mach grad ein paar Spielerreien in der Konsole. Z. B. möchte ich einfache "Fenster" zeichnen lassen. (eben so TUI-mäßig) Da der Aufbau doch immer etwas langsam von statten geht, möchte ich das ganze gerne buffern. Zuerst dachte ich da an ein char[][]-Array, welches dann mittels einer Funktion auf den Bildschirm ausgegeben wird. Die Idee ist natürlich nichts, da auch hier wieder ein langsamer Aufbau stattfindet, und da keine Farbinformationen gespeichert werden können.
    Dann hab ich mir die Console-Funktionen der windows.h etwas genauer angesehen, und wenn ich diese richtig verstehe ist hier soetwas schon implementiert. Leider scheitert es noch etwas an der Anwendung.

    // Instanzen erstellen
    HANDLE bufferA = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    HANDLE bufferB = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    
    // Standardbuffer für Ausgabe 'bufferB', angezeigter Buffer 'bufferA'
    SetStdHandle(STD_OUTPUT_HANDLE | STD_INPUT_HANDLE | STD_ERROR_HANDLE, bufferB);
    SetConsoleActiveScreenBuffer(bufferA);
    
    // Auf 'bufferB' schreiben
    std::cout << "test" << endl;
    
    // Nach Benutzerinteraktion auf bufferB umschalten
    system("pause > nul");
    SetConsoleActiveScreenBuffer(bufferB);
    
    // Warten...
    system("pause > nul");
    

    Die system()-Aufrufe sind lediglich als Kontrollstruktur vorhanden. Ausgegeben wird in dem Beispiel rein garnichts 😞 Weiß jemand was ich falsch gemacht habe? Oder hab ich etwas grundsätzliches missverstanden?

    Vielen Dank schonmal & einen schönen Sonntag!



  • Hi du !
    Ein Beispiel für einen Konsolendoppelpuffer findest du hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-211701.html
    Die Beiden Puffer sind CHAR_INFO boom und CHAR_INFO area.
    Diese werden abwechselnd mit WriteConsoleOutput auf den Bildschirm geschrieben.
    Man kann mit Hilfe von CHAR_INFO einzelnen Positionen ( Buchstabenzellen ) Vorder- und Hintergrundfarbe zuweisen.

    MfG,
    B.B.A.



  • Danke hat mir sehr geholfen 🙂



  • Entschuldigt bitte den Doppelpost, da ich Gast bin kann ich leider nich editieren.
    Leider klappt die Ausgabe von ASCII Sonderzeichen irgendwie nicht 😕

    CHAR_INFO buf[80*25];
    // weder
    buf[i].Char.AsciiChar = static_cast<char>(177);
    // noch
    buf[i].Char.AsciiChar = static_cast<char>(177);



  • wieso nicht?
    wie lautet die fehlermeldung ?

    bei mir funktioniert das:

    buf[0].Char.AsciiChar = 177;
    	cout << buf[0].Char.AsciiChar;
    


  • Also erstma oben ich meinte natürlich weder .AsciiChar noch .UnicodeChar klappt.
    Zur Compilezeit gab's keine Fehler, allerdings gibt er immer ein "?" aus. Auch ohne den typecast (also = 177 direkt) klappt es nicht. 😞 Ich kenn lediglich über .UnicodeChar = 'a' o. Ä. Sachen ausgeben.



  • versteh ich nicht, bei mir geht das, dann kommt dieses krusselzeichen, das gepunktete rechteck.
    dein fehler muss wo anders liegen.
    probier mal das:
    putchar(177);
    oder das:
    printf("%c", 177 );
    was passiert dann ?



  • Danke für deine Antwort.

    Beides mal die korrekte Ausgabe, also das gepunktete Rechteck. Als IDE/Compiler nutze ich Microsoft Visual Studio 2008.
    Hier mal mein kompletter Testcode:

    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    	CHAR_INFO ausgabe[80*25];
    	COORD size = {80, 25};
    	COORD origin = {0, 0};
    	SMALL_RECT r = {0, 0, 80-1, 25-1};
    
    	for(int i = 0; i < 80 * 25; i++) {
    		ausgabe[i].Char.AsciiChar = 177;
    		ausgabe[i].Attributes = 0 | FOREGROUND_GREEN;
    	}
    
    	WriteConsoleOutput(console, ausgabe, size, origin, &r);
    	system("pause > nul");
    


  • silentguard schrieb:

    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    	CHAR_INFO ausgabe[80*25];
    	COORD size = {80, 25};
    	COORD origin = {0, 0};
    	SMALL_RECT r = {0, 0, 80-1, 25-1};
    
    	for(int i = 0; i < 80 * 25; i++) {
    		ausgabe[i].Char.AsciiChar = 177;
    		ausgabe[i].Attributes = 0 | FOREGROUND_GREEN;
    	}
    	WriteConsoleOutput(console, ausgabe, size, origin, &r);
    	system("pause > nul");
    

    Ok, funzt 👍

    Für

    ausgabe[i].Attributes = 0 | FOREGROUND_GREEN;
    

    kannst du auch

    ausgabe[i].AttributesFOREGROUND_GREEN;
    

    schreiben



  • Ich push ungern meine Theards, aber hat wirklich keiner eine Ahnung wieso die Ausgabe von AsciiZeichen nicht funktioniert? Ich häng ziemlich an diesem Problem. leider..
    Sorry und schonma vielen Dank



  • silentguard schrieb:

    Ich push ungern meine Theards, aber hat wirklich keiner eine Ahnung wieso die Ausgabe von AsciiZeichen nicht funktioniert? Ich häng ziemlich an diesem Problem. leider..
    Sorry und schonma vielen Dank

    Kapier ich nicht, bei mir laufen alle hier vorgestellten Versionen.
    Hast du auch windows.h inkludiert ?



  • Jap selbstverständlich, lässt sich auch ohne Probleme kompilieren, lediglich wird das gewünschte Zeichen nicht ausgegeben. Welchen Compiler nutzt du?



  • Visual Studio



  • Also ich hab rausgefunden an was es lag. In den Projekteinstellung war als Zeichenstz Unicode gewählt, ich hab dies geändert und nun funst es!


Anmelden zum Antworten