Comment puis-je remplacer la même portion de la console dans une native de Windows C++ console application, sans l'aide d'un 3ème Partie de la bibliothèque?

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

  •  09-06-2019
  •  | 
  •  

Question

J'ai une application console qui doit afficher l'état des éléments, mais plutôt que d'avoir de texte sur l'écran comme un fou, je préfère voir le statut actuel de continuer à montrer sur les mêmes lignes.Pour exemple:

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

devrait être la sortie, où les " nn " est le courant de pourcentage) et 'bbbb' est une taille de mémoire tampon, mis à jour périodiquement sur les mêmes lignes de la console.

La première approche que j'ai adoptée tout simplement imprimé le nombre correct de correction arrière de la console avant de l'impression de l'état nouveau, mais cela a un scintillement désagréable que je veux me débarrasser de.Je tiens également à coller, soit de la bibliothèque standard ou MS-fonctionnalités (VC 8) afin de ne pas introduire une autre dépendance pour cela, un simple besoin.

Était-ce utile?

La solution

Vous pouvez utiliser SetConsoleCursorPosition.Vous aurez besoin de demander GetStdHandle pour obtenir un handle pour le tampon de sortie.

Autres conseils

Joseph, JP, et CodingTheWheel tous fourni une aide précieuse.

Pour mon cas simple, la plus straight-forward approche semble basée sur CodingTheWheel réponse:

// 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
  //...
}

Pour plus des problèmes compliqués, le plein console API comme prévu par La réponse de JP, en coordination avec les exemples fournis par le lien à partir de Joseph répondre peut s'avérer utile, mais j'ai trouvé le travail nécessaire d'utiliser des CHAR_INFO trop fastidieux pour une application simple.

Si vous imprimez à l'aide de et ne pas utiliser une fonction qui génère un saut de ligne ou ajouter un à la fin, le curseur va revenir au début de la ligne et de les imprimer au cours de la prochaine chose que vous mettez en place.La génération de la chaîne complète avant l'impression pourrait réduire le scintillement ainsi.

Mise à JOUR:La question a été modifié pour 2 lignes de sortie au lieu de 1 ce qui rend ma réponse plus complète.Une plus compliqué approche est probablement nécessaire.JP a la bonne idée avec le Console API.Je crois que le site ci-dessous les détails de beaucoup de choses que vous aurez besoin pour atteindre votre objectif.Le site mentionne également que la clé pour réduire le scintillement est de rendre tout à l'écran avant de l'afficher.Cela est vrai lorsque vous êtes en affichage sur l'écran si c'est du texte ou des graphiques (2D ou 3D).

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

Dans le cas où le Joseph suggestion ne vous donne pas assez de flexibilité, avoir un regard sur la Console API: http://msdn.microsoft.com/en-us/library/ms682073(SV.85).aspx.

Sous Linux, vous pouvez accomplir cela en impression \b et/ou vers stderr.Vous pourriez avoir besoin de faire des essais pour trouver la bonne combinaison de choses dans Windows.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top