SetConsoleTextAttribute : bug ?

Bids Messages postés 3 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 18 août 2003 - 15 août 2003 à 21:42
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 - 18 août 2003 à 22:14
Bonjour,

Je me sers actuellement de la fonction setConsoleTextAttribute dans une application en mode console, pour modifier la couleur du texte affiche.
Cela fonctionne au premier abord, mais etrangement apres qq dizaines d'affichages, le comportement de la couleur du texte devient anormale, le couleur du texte n'est plus respectee et redevient grise.

Le code (bidon...) ci-dessous produit cet effet, sur au moins deux systemes (win98 et win NT4)

for(int i=0 ; i < 25 ; i++)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN);

printf("This is a test\n");

Sleep(500);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE |
FOREGROUND_RED | FOREGROUND_BLUE);

printf("This is a test\n");

Sleep(500);
}

Mon analyse est la suivante : apparemment l'appel a SetConsoleTextAttribute semble avoir un effet limite aux caracteres dont les coordonnees ne sont pas hors des limites de la fenetre console initiale (typiquement 25*80 caracteres). Des que l'on affiche des caracteres supplementaires qui amenent a faire scroller le texte, l'effet de seConsoleTextAttribute s'evapore....

Quelqu'un pourrait-il m'expliquer ce phenomene, et comment le contourner pour pouvoir ecrire une application qui fait des sorties en couleur dans une console, sur des centaines de lignes successives ?

Merci d'avance !

5 réponses

cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
16 août 2003 à 14:32
8-) Neodante 8-)

J'ai eu un problème similaire, par conséquent maintenant j'efface l'écran ou je remet le curseur en haut (cf une de mes sources (et la plus merdique -> gestion d'employés avec console + APIs ... ou un truc dans ce genre sur le site))
@+
0
Bids Messages postés 3 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 18 août 2003
17 août 2003 à 21:11
Merci...mais ca confirme plutot mon intuition, pas moyen d'avoir une console avec des quantites de logs "qui defilent"
sur plusieurs ecrans, et une gestion des couleurs correcte :(

J'ai tente une immonde bidouille consistant a faire scroller l'ecran de la console d'une ligne avec un truc du genre printf("\n"), puis de faire l'appel a SetConsoleTextAttribute AVANT d'ecrire la ligne de texte en question, mais sans grand succes...

Je vais probablement me resoudre a ecrire une petite appli win32 en mode GUI pour arriver a mes fins.

Merci qd meme...
je vais continuer a chercher un workaround, tant qu'il me restera des cheveux :)

Bids
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
18 août 2003 à 12:41
8-) Neodante 8-)

Bonne chance !!!!
@+
0
Bids Messages postés 3 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 18 août 2003
18 août 2003 à 22:04
Rectification, apres verification ma bidouille fonctionne ! :

au lieu de faire :

setConsoleTextAttribute(...)
printf("texte a afficher\n");

il "suffit" de faire :

printf("\n");
setConsoleTextAttribute(...)
printf("texte a afficher");

et ca fonctionne dans tous les cas. Le premier "\n" fait scroller l'ecran d'une ligne si besoin, du coup le setConsoleTextAttribute qui s'ensuit agit sur la ligne nouvellement creee, et le printf final en beneficie...

C'est carrement tire par les cheveux, mais au moins ca marche, j'ai fini de galerer :)

a+
Bids
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
18 août 2003 à 22:14
8-) Neodante 8-)

Au moins je mourrais moins bête ce soir !!!
@+ et merci pour la soluce !
0
Rejoignez-nous