[RESOLU] API Console -> Colorer du texte

API Console -> Colorer du texte [RESOLU] - API Win32 - Programmation

Marsh Posté le 21-03-2010 à 23:05:51    

Bonjour,
 
Voilà un petit temps que je chipote en C avec l'API relative à la gestion de la console. Le temps commence à me manquer et je suis sur un problème apparemment simple mais dont je ne puis me sortir. Je voudrais pouvoir changer les attributs d'un bloc de caractères, et je voudrais pouvoir écrire pour la première fois un bloc de caractère directement dans une couleur précise.
 
Pour la première partie de mon problème, il y a WriteConsoleOutputAttribute. Mais cette fonction ne me permet de changer l'attribut que d'un caractère à la fois. En effet, quand je spécifie un nombre plus grand que 1 pour le 3ème paramètre, seul le premier caractère acquiert les caractéristiques demandées, les suivant prennent des couleurs aléatoires sans que je sache pourquoi. Je dois donc écrire une boucle comme celle-ci
 

Code :
  1. COORD txt;
  2.     WORD attr;
  3.     attr = BACKGROUND_RED | FOREGROUND_GREEN;
  4.     DWORD len = 1;
  5.     WORD n;
  6.     int i;
  7.     txt.X = 0;
  8.     txt.Y = 0;
  9.     for (i = 0; i < 8; i++)
  10.     {
  11.         WriteConsoleOutputAttribute (hStdout, &attr, len, txt, &n);
  12.         txt.X++;
  13.     }


 
Ok, ça fonctionne, mais ce serait mieux si WriteConsoleOutputAttribute tenait ses promesses... où est mon problème?
 
En ce qui concerne la seconde partie de mon problème, et bien je dois ne pas bien comprendre la msdn parce que je ne trouve pas de fonction qui me permette d'écrire simplement une série de caractères directement dans une couleur donnée. Est-ce que quelqu'un serait prêt à me montrer un exemple simple?
 
Je vous remercie d'avance
Florimond


Message édité par Florimondh le 22-03-2010 à 16:30:16
Reply

Marsh Posté le 21-03-2010 à 23:05:51   

Reply

Marsh Posté le 22-03-2010 à 11:27:35    

Bonjour,
Pour le 1°, Modifies tu "txt.X++" car la position doit etre modifier en fonction du nombre de caractere je pense?
Pour le 2°, Regarde SetConsoleTextAttribute ( http://msdn.microsoft.comQ/en-us/l [...] 85%29.aspx )
Quand aux exemples: http://lmgtfy.com/?q=c%2B%2B+console+color

Reply

Marsh Posté le 22-03-2010 à 13:08:04    

1) Je ne comprends pas bien ta question... j'ai sans doute mal exprimé la mienne. En fait cette fonction se présente comme ceci:  
 
BOOL WINAPI WriteConsoleOutputAttribute(
  __in   HANDLE hConsoleOutput,
  __in   const WORD *lpAttribute,
  __in   DWORD nLength,
  __in   COORD dwWriteCoord,
  __out  LPDWORD lpNumberOfAttrsWritten
);
 
Avec nLength: The number of screen buffer character cells to which the attributes will be copied.  
 
J'ai donc de bonnes raisons de penser qu'en positionnant txt.X et Y au début de ma chaine, et en indiquant le nombre de caractères de cette chaine en 3ème paramètre, tous les caractères prendront les attributs défini en second paramètre. En pratique,ça ne marche que pour le premier caractère, les suivant prenant des couleurs aléatoires. C'est pour ça que je fait la boucle présentée ci-dessus qui ne modifie qu'un caractère à la fois en incrémentant txt.X de 1 à chaque tour, jusqu'à la fin de la chaine.
Ce que je voudrais, c'est pouvoir me passer de cette boucle parce que  la fonction se comportera normalement par rapport au paramètre nLenght.
 
2) Merci :) Non ce n'était pas si dur que ça, c'est juste que j'ai résolu déjà un tas de soucis mais que ma persévérance a des limites (que je tends à repousser), au bout d'un temps j'ai tendance à me reposer sur les autres...

Reply

Marsh Posté le 22-03-2010 à 15:06:06    

Citation :

si WriteConsoleOutputAttribute tenait ses promesses... où est mon problème

Cette fonction tient ses promesse quand on l'utilise comme elle a été prévue. Si tu veux faire ça par groupe de len caractères a la fois, il faut faire:
WORD attr[len];
for (i = 0; i<len;i++) attr[i] = BACKGROUND_RED | FOREGROUND_GREEN;
etc.
Tes couleurs aléatoires, c'est justement ça: c'est parce que pour le deuxième caractère, dans ton code, la fonction va lire le WORD qui suit attr et l'interpréter comme une valeur d'attribut, etc.

 

WriteConsoleOutputAttribute est plutôt fait pour le cas ou les attributs varient d'un caractère au suivant, mais en fait, dans le cas qui t'intéresse, c'est FillConsoleOutputAttribute() que tu devrais employer je pense, qui propage un attribut unique à plusieurs caractères consécutifs.

 

A+,


Message édité par gilou le 22-03-2010 à 15:09:30

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 22-03-2010 à 16:28:51    

haaaaaa c'était donc pour l'usage d'un vecteur le pointeur *lpAttribute! je m'étais effectivement demandé quel en était l'intérêt --' C'est donc ça que je n'avais pas saisi dans l'usage de cette fonction. Merci beaucoup à toi gilou, ainsi qu'à breizhbugs, j'ai toutes mes réponses et les idées un peu plus claires à présent.
 
Bonne fin de journée
Florimond

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed