Wie kann ich denselben Teil der Konsole in einer Windows-nativen C++-Konsolen-App überschreiben, ohne eine Bibliothek eines Drittanbieters zu verwenden?

StackOverflow https://stackoverflow.com/questions/45286

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe eine Konsolen-App, die den Status von Elementen anzeigen muss, aber anstatt dass der Text wie verrückt vorbeiläuft, möchte ich lieber, dass der aktuelle Status weiterhin in denselben Zeilen angezeigt wird.Als Beispiel:

Running... nn% complete
Buffer size: bbbb bytes

sollte die Ausgabe sein, wobei „nn“ der aktuelle Fertigstellungsgrad in Prozent und „bbbb“ eine Puffergröße ist, die regelmäßig in denselben Zeilen der Konsole aktualisiert wird.

Beim ersten Ansatz, den ich gewählt habe, wurde einfach die korrekte Anzahl von Rückschritten auf der Konsole ausgegeben, bevor der neue Status gedruckt wurde. Dies hat jedoch ein lästiges Flackern zur Folge, das ich loswerden möchte.Außerdem möchte ich mich entweder an die Standardbibliothek oder an die von MS bereitgestellte Funktionalität (VC 8) halten, um keine weitere Abhängigkeit für diesen einen einfachen Bedarf einzuführen.

War es hilfreich?

Lösung

Sie können verwenden SetConsoleCursorPosition.Sie müssen anrufen GetStdHandle um ein Handle für den Ausgabepuffer zu erhalten.

Andere Tipps

Joseph, JP und CodingTheWheel haben alle wertvolle Hilfe geleistet.

Für meinen einfachen Fall schien der einfachste Ansatz auf zu basieren CodingTheWheels Antwort:

// before entering update loop
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(h, &bufferInfo);

// update loop
while (updating)
{
  // reset the cursor position to where it was each time
  SetConsoleCursorPosition(h, bufferInfo.dwCursorPosition);

  //...
  // insert combinations of sprintf, printf, etc. here
  //...
}

Für kompliziertere Probleme die vollständige Konsolen-API wie bereitgestellt von JPs Antwort, in Abstimmung mit den über die bereitgestellten Beispielen Verknüpfung aus Josephs Antwort mag sich als nützlich erweisen, aber ich fand die nötige Arbeit, um sie zu nutzen CHAR_INFO zu umständlich für eine so einfache App.

Wenn Sie mit drucken und keine Funktion verwenden, die eine neue Zeile generiert oder am Ende hinzufügt, springt der Cursor zum Anfang der Zeile zurück und druckt einfach über das nächste von Ihnen eingegebene Element.Das Generieren der vollständigen Zeichenfolge vor dem Drucken kann ebenfalls das Flimmern reduzieren.

AKTUALISIEREN:Die Frage wurde in 2 Ausgabezeilen statt 1 geändert, wodurch meine Antwort nicht mehr vollständig ist.Wahrscheinlich ist ein komplizierterer Ansatz erforderlich.JP hat mit dem die richtige Idee Konsolen-API.Ich glaube, dass die folgende Website viele der Dinge detailliert beschreibt, die Sie benötigen, um Ihr Ziel zu erreichen.Die Website erwähnt auch, dass der Schlüssel zur Reduzierung von Flimmern darin besteht, alles außerhalb des Bildschirms zu rendern, bevor es angezeigt wird.Dies gilt immer dann, wenn Sie etwas auf dem Bildschirm anzeigen, sei es Text oder Grafik (2D oder 3D).

http://www.benryves.com/tutorials/?t=winconsole

Falls Ihnen der Vorschlag von Joseph nicht genügend Flexibilität bietet, werfen Sie einen Blick auf die Konsolen-API: http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx.

Unter Linux können Sie dies erreichen, indem Sie \b und/oder in stderr ausgeben.Möglicherweise müssen Sie experimentieren, um die richtige Kombination von Dingen in Windows zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top