Améliorer votre application console C++ : Plus de sortie scintillante
Si vous développez une application console en C++ sur Windows, vous avez peut-être rencontré un problème commun mais frustrant : comment afficher des mises à jour dynamiques de l’état (comme des pourcentages de progression ou des tailles de tampon) sans submerger la console avec un texte qui défile en continu. Au lieu que le texte défile hors de l’écran, vous aimeriez “écraser” des lignes spécifiques sur la console pour afficher des mises à jour en temps réel de manière fluide. Cet article de blog se penchera sur une solution à ce problème en utilisant des fonctions intégrées de Windows, spécifiquement SetConsoleCursorPosition
et GetStdHandle
.
Le Problème
Imaginez que votre application console doit afficher une mise à jour de l’état, telle que :
En cours d'exécution... nn% terminé
Taille du tampon : bbbb octets
Ici, nn
représente le pourcentage d’achèvement (par exemple, 45) et bbbb
désigne une taille de tampon (par exemple, 2048 octets). Le défi surgit lorsque vous imprimez simplement de nouvelles valeurs ; le texte défile hors écran, créant une sortie désordonnée et distrayante. Utiliser des retours arrière pour écraser les lignes imprimées précédemment introduit un effet de scintillement qui nuit à l’expérience utilisateur.
Pourquoi le Scintillement Arrive
Le scintillement se produit principalement lorsque vous essayez d’effacer ou d’écraser des lignes en utilisant des combinaisons de retours arrière et de nouveau texte. Cela peut entraîner une expérience visuellement dérangeante, rendant difficile pour les utilisateurs de se concentrer sur les mises à jour d’état. Heureusement, il existe une solution plus nette : contrôler directement la position du curseur.
La Solution : Utiliser SetConsoleCursorPosition
Pour surmonter ce défi de scintillement, vous pouvez utiliser la fonction API Windows SetConsoleCursorPosition
, qui vous permet de déplacer le curseur à une position spécifique dans la console avant d’imprimer de nouvelles données.
Étapes pour Mettre en Œuvre la Solution
Voici une approche structurée pour mettre à jour la sortie de la console de manière fluide :
-
Inclure les En-têtes Nécessaires : Avant de pouvoir utiliser des fonctions spécifiques à Windows, assurez-vous d’inclure les en-têtes nécessaires au début de votre programme C++ :
#include <windows.h> #include <iostream>
-
Obtenir le Handle du Tampon de Sortie : Utilisez la fonction
GetStdHandle
pour récupérer un handle vers la sortie standard. Cette étape est cruciale pour manipuler la sortie de la console.HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
-
Définir la Position du Curseur dans la Console : Chaque fois que vous devez mettre à jour la sortie, utilisez
SetConsoleCursorPosition
pour spécifier où dans le tampon de la console placer votre curseur :COORD coord; coord.X = 0; // Définir la position X (colonne) coord.Y = 0; // Définir la position Y (ligne) SetConsoleCursorPosition(hConsole, coord);
-
Imprimer Vos Données Actualisées : Après avoir défini la position du curseur, vous pouvez imprimer le texte mis à jour sans vous soucier du scintillement :
std::cout << "En cours d'exécution... " << nn << "% terminé" << std::endl; std::cout << "Taille du tampon : " << bbbb << " octets" << std::endl;
Exemple de Code
Voici un exemple complet démontrant cette approche :
#include <windows.h>
#include <iostream>
#include <thread> // Pour le contrôle de sommeil
#include <chrono>
int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
for (int i = 0; i <= 100; i += 10) {
COORD coord;
coord.X = 0; // Ajustement à gauche
coord.Y = 0; // Ajustement à la première ligne
SetConsoleCursorPosition(hConsole, coord);
std::cout << "En cours d'exécution... " << i << "% terminé" << std::endl;
std::cout << "Taille du tampon : " << (1000 + i) << " octets" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(500)); // Simuler le travail
}
return 0;
}
Conclusion
En utilisant SetConsoleCursorPosition
et GetStdHandle
, vous pouvez améliorer vos applications console C++ avec une sortie dynamique tout en évitant le scintillement qui accompagne souvent des techniques de sortie plus simples. Cela permet aux utilisateurs de mieux se concentrer sur les mises à jour d’état affichées.
N’hésitez pas à mettre en œuvre cette approche dans votre prochain projet console C++ et améliorez l’expérience utilisateur de votre application !