Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1460 connectés 

  FORUM HardWare.fr
  Programmation
  API Win32

  [RESOLU] API Console -> Colorer du texte

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] API Console -> Colorer du texte

n°1975820
Florimondh
Posté le 21-03-2010 à 23:05:51  profilanswer
 

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
mood
Publicité
Posté le 21-03-2010 à 23:05:51  profilanswer
 

n°1975895
breizhbugs
Posté le 22-03-2010 à 11:27:35  profilanswer
 

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

n°1975937
Florimondh
Posté le 22-03-2010 à 13:08:04  profilanswer
 

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

n°1975988
gilou
Modérateur
Modzilla
Posté le 22-03-2010 à 15:06:06  profilanswer
 

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é!  --
n°1976029
Florimondh
Posté le 22-03-2010 à 16:28:51  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  API Win32

  [RESOLU] API Console -> Colorer du texte

 

Sujets relatifs
[Résolu] Rester invisible de google pendant qq temps ?[résolu] calculs avant la compilation, avec le pré-processeur
Fonction globale: symbole externe non résoluRecaler du texte de plusieurs lignes contre une image
[Résolu][Socket] connaitre l'IP de connexion[Résolu] IE et erreurs JS incompréhensibles
[Résolu][SQL/ACCESS] Problème COUNT / GROUP BY[Résolu] Création d'une page html pour email, largeur zone texte ?
Plus de sujets relatifs à : [RESOLU] API Console -> Colorer du texte


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR