Libgraphc - dessin d'ui en mode console

Soyez le premier à donner votre avis sur cette source.

Vue 6 065 fois - Téléchargée 389 fois

Description

Voila, je poste ma librairie de fonction de dessin d'interface utilisateur en mode console parce que je n'ai pas encore vu de code comme celui la sur cppfrance, qu'elle est relativement aboutie, et qu'elle peut permettre à certains de coder des applications console avec une belle interface, en utilisant un API relativement léger =).

Bon, les fonctions, c'est du vu et du déjà vu, mais je poste quand même parce que le code à quelques intérêts notables, en plus de son utilité pratique.
Pour les détails sur l'utilisation des fonctions, je vous invite a regarder le code source, ou bien le fichier d'aide au format html fourni dans le ZIP (aide vraiment détaillé).

Parmi ces intérets, citons notamment un exemple d'utilisation des fonction à nombre d'arguments variables, via les va_list. Je me suis servi du code de printf, trouvé dans un stdio.c sur le net, pour pouvoir écrire ma fonction (il s'agit de xprintf, et de xrprintf).

Voila c'est tout ce que j'avais à dire sur ce code. A+ et bonne lecture.

PS : Le ZIP contient la solution Visual Studio 2008, qui contient elle même 2 solutions :
- LibGraphC : la librairie à proprement parler, il s'agit d'un projet de type Win32 Static Library générant un fichier libgraphc.lib.

- LibGraphCTest : un projet console de test de la librairie, il est linké avec la librairie, et comporte une copie du header graphc.h

Pour recompiler ce code via un autre compilateur, il faudra créer un projet static library (je pense notamment à dev-cpp, code::blocks ...) comportant les fichiers graphc.h, graphc.c, et drawc.c, compiler, et linker le binaire résultant avec un projet de test.
voila =)

Source / Exemple :


// je poste ici uniquement le code source de xprintf
// qui reprend le code de printf, parce que le concept
// est intéréssant et parce que j'ai eu du mal à le trouver
// sur le net.

int xprintf(USHORT x, USHORT y, const char* format, ...)
{
    // déclaration des variables
    va_list args;
    int n;

    // on positionne le curseur en x,y
    setxy(x, y);
    // on initialise la liste d'argument
    va_start (args, format);
    // on imprime la chaine
    n = vprintf (format, args);
    // on ferme la liste d'arguments
    va_end (args);
    // et on retourne n
    return n;
}

// Et ici, je poste le code que j'ai tapé dans ma fonction main
// qui m'a permis d'obtenir l'interface vue sur le screen shot

void draw_ui()
{
    // on remplit tout en bleu et on écrit en jaune
    fill(DBLUE, YELLOW);
    // on dessine un premier rectangle FAT
    rect(0, 0, 40, 25, FAT, false);
    // on crée une "banniere"
    hline(0,4,40, FAT);
    // on rajoute les caracteres d'angles
    xprint(0 , 4, (char)CROSS_LEFT_FAT);
    xprint(39, 4, (char)CROSS_RIGHT_FAT);
    // on écrit le titre
    setcolor(GREEN, DBLUE);
    xprintf(15, 2, "Titre FAT");
    // on écrit cette fois en cyan sur noir
    setcolor(CYAN, DBLUE);
    /// on dessine un deuxieme rectangle slim
    rect(40, 0, 39, 25, SLIM, false);
    // on crée un banniere
    hline(40, 4, 39, SLIM);
    // on rajoute les caracteres d'angles
    xprint(40, 4, (char)CROSS_LEFT_SLIM);
    xprint(78, 4, (char)CROSS_RIGHT_SLIM);
    // on écrit le titre
    setcolor(GREEN, DBLUE);
    xprintf(55, 2, "Titre SLIM %d", 2);
}

Conclusion :


Une librairie que je trouve utile, qui donne des beau résultats, facile à utiliser.
Je suis ouvert à toutes critiques qui pourrait me permettre d'améliorer/optimiser ce code.

N'hésitez pas à regarder le fichier d'aide html, il est tout beau :D et il est très détaillé.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
15
Date d'inscription
mercredi 29 mars 2006
Statut
Membre
Dernière intervention
6 juillet 2009

Merci pour ton code, très intéressant, je m'apprête à le décortiquer!
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
euh si on veut...
considère simplement que les arguments sont stockés l'un après l'autre dans une zone de mémoire spéciale (la pile, qui sert à contenir variables locales, arguments et adresses de retour).
Le compilateur ne fait pas de différence entre arguments fixes et arguments optionnels, lors de l'appel de la fonction il se contente de tout empiler.

petit exemple, pour appeler Sum(2,1,3) :
__asm
{
...
push 3L;
push 1L;
push 2L;
call dword ptr[Sum];
...
}
Messages postés
4
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
12 mai 2009

Effectivement, ton petit bout de code m'éclaire bien =).

Donc si j'ai tout suivi, le ... est l'équivalent d'un tableau, dont le premier élément est stocké a l'adresse suivant directement celle ou est stockée n.
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Juste pour info, puisque tu dis avoir eu du mal à trouver, une petite variante pour l'utilisation d'arguments variables sans varlist :
il suffit de récupérer l'adresse mémoire du dernier argument fixe, de cette manière on peut accéder aux suivants par un pointeur.

par exemple, une fonction Sum(unsigned n,...) qui additionne n entiers :

unsigned Sum(unsigned n,...)
{
unsigned *data=1+&n;
unsigned i,result=0;
for(i=0;i<n;i++) result+=data[i];
return result;
}

et on peut appeler Sum(2,1,1) ou Sum(3,1,4,178) ou ...


c'est sans doute ce que fait varlist implicitement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.