begin process at 2008 07 19 09:21:12
1 212 728 membres
67 nouveaux aujourd'hui
14 165 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

C/C++ SOUS WINDOWS SANS MFC - TUTORIAL 2 : ECRITURE DANS UNE FENETRE


Information sur la source

Catégorie :API Classé sous : wmpaint, hdc, ecrire, paint, texte Niveau : Débutant Date de création : 18/01/2006 Date de mise à jour : 19/01/2006 02:51:40 Vu : 9 966

Note :
4,33 / 10 - par 3 personnes
4,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

Description

Dans ce tutorial qui fait suite à C/C++ SOUS WINDOWS SANS MFC, nous allons voir comment écrire du texte dans une fenêtre.

Source

  • //TUTORIAL AFFICHAGE DE TEXTE DANS UNE FENETRE WINDOWS
  • Dans le tutorial précédent (C/C++ sous Windows sans MFC) il était expliqué comment créer une fenêtre sous Windows, avec une boucle de traitement de messages, et une procédure de traitement de ces messages.
  • Dans ce tutorial nous allons voir comment écrire du texte dans cette fenêtre, et comment l'afficher.
  • Dans des programmes écrits dans des langages tels que le Visual Basic, ou encore en C sous DOS, pour afficher du texte, il suffisait d'appeler une fonction d'affichage et de lui indiquer la chaine de caractère à faire apparaitre à l'écran. On pouvait agrémenter cet affichage d'options relatives à la couleur d'écriture, la hauteur des lettres.
  • Dans Windows, pour afficher du texte dans une fenêtre, c'est un peu différend. On ne va pas se servir de l'affichage direct. On va demander à Windows de redessiner la fenêtre et lors du message de raffraichissement de cette fenêtre, on va demander à ce que soit écrit le texte.
  • Une fenêtre qui s'affiche à l'écran demande souvent à être redessinée. Cela se produit par exemple lorsqu'une autre fenêtre passe devant, lorsqu'on déplace la fenêtre, lorsqu'on la diminue ou qu'on change ses dimensions. Losque cela se produit, Windows envoie le message WM_PAINT. C'est donc dans WM_PAINT que l'on doit placer tout ce que l'on veut qu'il soit dessiné dans notre fenêtre. A noter que les éléments de fenêtre basiques (boutons de fermeture, cadre...) sont redessinés par Windows lors de WM_PAINT sans que l'on ait besoin de le recoder.
  • Le message WM_PAINT apparait donc ainsi:
  • case WM_PAINT:
  • {
  • ........
  • }
  • A l'intérieur, avant d'écrire notre chaine de caractère, il va falloir paramétrer certaines choses.
  • Tout d'abbord, lorsqu'on dit dessiner dans une fenêtre, il faut comprendre dessiner sur le support prévu à l'écriture de cette fenêtre. C'est comme pour une feuille de papier, n'écrit pas dans la marge par exemple. La partie d'une fenêtre dans laquelle on doit écrire est la partie qui par défaut est blanche. Cette partie ne s'identifie pas par la valeur HWND de la fenêtre mais par une valeur de type HDC. Le HDC est la partie du HWND dans laquelle on peut dessiner, ecrire...
  • On créé donc en premier lieu une variable hDC
  • HDC hDC;
  • Ensuite, on va attribuer à notre hDC la partie dessin de notre fenêtre.
  • hDC = GetWindowDC(hFenetre); //hFenetre est de type HWND
  • Maintenant, on va créer une variable structure PAINTSTRUCT. Il s'agit d'un élément nécessaire pour peindre la zone cliente de notre fenêtre. Il n'est pas nécessaire d'en changer les paramètres
  • PAINTSTRUCT Ps;
  • Maintenant que nous disposons de notre fenêtre, de son HDC et de notre élément PAINTSTRUCT, on va commencer à peindre.
  • Le début du dessin de notre texte va commencer par la fonction suivante : BeginPaint
  • hDC = BeginPaint( hFenetre, &Ps);
  • Maintenant, on va placer l'écriture de notre texte avec la fonction TextOut
  • TextOut (hDC, 10, 10, "Voici notre Phrase", strlen("Voici notre Phrase"));
  • La fonction TextOut va se charger d'écrire aux coordonnées 10,10 de notre fenêtre la phrase "Voici notre Phrase", strlen indique la taille de la chaine.
  • Enfin, il faut mettre fin à la peinture avec la fonction EndPaint :
  • EndPaint (hFenetre, &Ps);
  • voila, notre évènement WM_PAINT est complet. Maintenant, lorqeu la fenêtre aura à être redessinée, notre phrase apparaitra. Il manque néamoins quelque chose.
  • On ne veut pas necessairement attendre que notre programme reçoive une demande de redessiner la fenêtre dans 15 ans, lorsque une autre fenêtre passera par dessus par exemple. On veut que notre texte s'affiche tout de suite. Il va falloir indiquer explicitement à Windows qu'on veut que notre fenêtre se redessine tout de suite. Ceci se
  • fait en indiquant à Windows que la fenêtre n'est pas valide.
  • Ainsi, dans la procédure générale de dessin des fenêtres et contrôles, il faut placer la fonction InvalidateRect:
  • InvalidateRect (hFenetre, 0, FALSE);
  • Voici ci dessous le programme complet associant le tutorial C/C++ sous Windows sans MFC avec ce qui vient d'être vu:
  • #include <windows.h>
  • int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd);
  • LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  • bool stop = false;
  • int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  • {
  • HWND hFenetre;
  • MSG MessagesAEnvoyer;
  • WNDCLASS Fenetre;
  • Fenetre.lpszMenuName =NULL;
  • Fenetre.cbClsExtra =0;
  • Fenetre.cbWndExtra =0;
  • Fenetre.hInstance = hInstance;
  • Fenetre.lpfnWndProc = WinProc;
  • Fenetre.lpszClassName = "FENETRE DE TYPE A MOI";
  • Fenetre.style = CS_VREDRAW | CS_HREDRAW;
  • Fenetre.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  • Fenetre.hIcon =(HICON) LoadIcon(hInstance, IDI_APPLICATION);
  • Fenetre.hCursor =(HCURSOR) LoadCursor(hInstance, IDC_ARROW);
  • RegisterClass(&Fenetre);
  • hFenetre = CreateWindow("FENETRE DE TYPE A MOI", "Voici la fenêtre", WS_OVERLAPPEDWINDOW, 200, 200, 300, 250, NULL, NULL, hInstance, NULL);
  • ShowWindow(hFenetre,nShowCmd);
  • InvalidateRect(hFenetre, 0, FALSE);
  • while (GetMessage(&MessagesAEnvoyer, hFenetre, 0, 0))
  • {
  • TranslateMessage (&MessagesAEnvoyer);
  • DispatchMessage (&MessagesAEnvoyer);
  • }
  • return 0;
  • }
  • LRESULT CALLBACK WinProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  • {
  • switch (uMsg)
  • {
  • case WM_DESTROY:
  • {
  • stop = true ;
  • PostQuitMessage(0);
  • return 0;
  • }
  • case WM_PAINT:
  • {
  • HDC hDC;
  • hDC = GetWindowDC(hWnd);
  • PAINTSTRUCT Ps;
  • hDC = BeginPaint(hWnd, &Ps);
  • TextOut (hDC, 10, 10,"Voici notre Phrase", strlen("Voici note Phrase"));
  • EndPaint(hWnd, &Ps);
  • return 0;
  • }
  • }
  • return DefWindowProc(hWnd, uMsg, wParam, lParam);
  • }
  • Options:
  • Avant d'écrire le texte avec la procédure TextOut, on peut utiliser diverses options
  • Par exemple utiliser des couleurs de texte différentes que celles par défaut avec la fonction SetTextColor
  • SetTextColor (hDC,RGB(255,0,0)); //Ecrit le text des commandes TextOut suivantes en rouge.
  • SetBkColor(hDC, RGB(255,0,0)); //Ecrit le texte sur un fond rouge.
  • ou encore :
  • HFONT Font;
  • Font = CreateFont(20, 30, 50, 50, FW_REGULAR, TRUE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Time New Roman");
  • //Crée une police de type Times News Roman dans laquelle la taille des lettres sera 20,30. Les valeurs TRUE, FALSE, FALSE indique les styles italic non souligné. Je vous invite à voir les autres options sur MSDN (options notament liées à l'orientation du texte correspondant ici aux paramètres 50,50.
  • SelectObject(hDC, (HGDIOBJ) Font); //Utilise cette font créee pour les TextOut qui suivent.
  • Voilà pour ce qui est de l'écriture de textes dans une fenêtre avec WM_PAINT. A noter que WM_PAINT sert aussi pour le dessin de tout autre graphique.
  • Bon courage.
//TUTORIAL AFFICHAGE DE TEXTE DANS UNE FENETRE WINDOWS
Dans le tutorial précédent (C/C++ sous Windows sans MFC) il était expliqué comment créer une fenêtre sous Windows, avec une boucle de traitement de messages, et une procédure de traitement de ces messages.
Dans ce tutorial nous allons voir comment écrire du texte dans cette fenêtre, et comment l'afficher.

Dans des programmes écrits dans des langages tels que le Visual Basic, ou encore en C sous DOS, pour afficher du texte, il suffisait d'appeler une fonction d'affichage et de lui indiquer la chaine de caractère à faire apparaitre à l'écran. On pouvait agrémenter cet affichage d'options relatives à la couleur d'écriture, la hauteur des lettres.

Dans Windows, pour afficher du texte dans une fenêtre, c'est un peu différend. On ne va pas se servir de l'affichage direct. On va demander à Windows de redessiner la fenêtre et lors du message de raffraichissement de cette fenêtre, on va demander à ce que soit écrit le texte.

Une fenêtre qui s'affiche à l'écran demande souvent à être redessinée. Cela se produit par exemple lorsqu'une autre fenêtre passe devant, lorsqu'on déplace la fenêtre, lorsqu'on la diminue ou qu'on change ses dimensions. Losque cela se produit, Windows envoie le message WM_PAINT. C'est donc dans WM_PAINT que l'on doit placer tout ce que l'on veut qu'il soit dessiné dans notre fenêtre. A noter que les éléments de fenêtre basiques (boutons de fermeture, cadre...) sont redessinés par Windows lors de WM_PAINT sans que l'on ait besoin de le recoder.

Le message WM_PAINT apparait donc ainsi:
case WM_PAINT:
{
........
}

A l'intérieur, avant d'écrire notre chaine de caractère, il va falloir paramétrer certaines choses.
Tout d'abbord, lorsqu'on dit dessiner dans une fenêtre, il faut comprendre dessiner sur le support prévu à l'écriture de cette fenêtre. C'est comme pour une feuille de papier, n'écrit pas dans la marge par exemple. La partie d'une fenêtre dans laquelle on doit écrire est la partie qui par défaut est blanche. Cette partie ne s'identifie pas par la valeur HWND de la fenêtre mais par une valeur de type HDC. Le HDC est la partie du HWND dans laquelle on peut dessiner, ecrire...

On créé donc en premier lieu une variable hDC
HDC hDC;

Ensuite, on va attribuer à notre hDC la partie dessin de notre fenêtre.
hDC = GetWindowDC(hFenetre);  //hFenetre est de type HWND

Maintenant, on va créer une variable structure PAINTSTRUCT. Il s'agit d'un élément nécessaire pour peindre la zone cliente de notre fenêtre. Il n'est pas nécessaire d'en changer les paramètres

PAINTSTRUCT Ps;

Maintenant que nous disposons de notre fenêtre, de son HDC et de notre élément PAINTSTRUCT, on va commencer à peindre.

Le début du dessin de notre texte va commencer par la fonction suivante : BeginPaint

hDC = BeginPaint( hFenetre, &Ps);

Maintenant, on va placer l'écriture de notre texte avec la fonction TextOut
TextOut (hDC, 10, 10, "Voici notre Phrase", strlen("Voici notre Phrase")); 			
La fonction TextOut va se charger d'écrire aux coordonnées 10,10 de notre fenêtre la phrase "Voici notre Phrase", strlen indique la taille de la chaine.

Enfin, il faut mettre fin à la peinture avec la fonction EndPaint :
EndPaint (hFenetre, &Ps);

voila, notre évènement WM_PAINT est complet. Maintenant, lorqeu la fenêtre aura à être redessinée, notre phrase apparaitra. Il manque néamoins quelque chose. 
On ne veut pas necessairement attendre que notre programme reçoive une demande de redessiner la fenêtre dans 15 ans, lorsque une autre fenêtre passera par dessus par exemple. On veut que notre texte s'affiche tout de suite. Il va falloir indiquer explicitement à Windows qu'on veut que notre fenêtre se redessine tout de suite. Ceci se
fait en indiquant à Windows que la fenêtre n'est pas valide. 
Ainsi, dans la procédure générale de dessin des fenêtres et contrôles, il faut placer la fonction InvalidateRect:
InvalidateRect (hFenetre, 0, FALSE);

Voici ci dessous le programme complet associant le tutorial C/C++ sous Windows sans MFC avec ce qui vient d'être vu:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd);

LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
bool stop = false; 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HWND hFenetre;
MSG MessagesAEnvoyer;

WNDCLASS Fenetre; 
Fenetre.lpszMenuName =NULL;
Fenetre.cbClsExtra  =0;
Fenetre.cbWndExtra =0;
Fenetre.hInstance = hInstance; 
Fenetre.lpfnWndProc = WinProc;
Fenetre.lpszClassName = "FENETRE DE TYPE A MOI";
Fenetre.style =  CS_VREDRAW | CS_HREDRAW; 
Fenetre.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
Fenetre.hIcon =(HICON)  LoadIcon(hInstance, IDI_APPLICATION);
Fenetre.hCursor =(HCURSOR)  LoadCursor(hInstance, IDC_ARROW);

RegisterClass(&Fenetre);

hFenetre = CreateWindow("FENETRE DE TYPE A MOI", "Voici la fenêtre", WS_OVERLAPPEDWINDOW, 200, 200, 300, 250, NULL, NULL, hInstance, NULL);

ShowWindow(hFenetre,nShowCmd);

InvalidateRect(hFenetre, 0, FALSE);


while (GetMessage(&MessagesAEnvoyer, hFenetre, 0, 0))
{ 
	TranslateMessage (&MessagesAEnvoyer); 
	DispatchMessage (&MessagesAEnvoyer);
}

return 0; 
}


LRESULT CALLBACK WinProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
		case WM_DESTROY:
		{
			stop = true ;
			PostQuitMessage(0);
			return 0;
		}
		case WM_PAINT:
		{
			HDC hDC;
			hDC = GetWindowDC(hWnd);
			PAINTSTRUCT Ps;
			hDC = BeginPaint(hWnd, &Ps);
			TextOut (hDC, 10, 10,"Voici notre Phrase", strlen("Voici note Phrase"));
			EndPaint(hWnd, &Ps);
			return 0;
		}
	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam); 
}
			


Options:
Avant d'écrire le texte avec la procédure TextOut, on peut utiliser diverses options
Par exemple utiliser des couleurs de texte différentes que celles par défaut avec la fonction SetTextColor
SetTextColor (hDC,RGB(255,0,0)); //Ecrit le text des commandes TextOut suivantes en rouge.
SetBkColor(hDC, RGB(255,0,0)); //Ecrit le texte sur un fond rouge.

 ou encore : 

HFONT Font;
Font = CreateFont(20, 30, 50, 50, FW_REGULAR, TRUE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, 												DEFAULT_QUALITY, DEFAULT_PITCH, "Time New Roman");
//Crée une police de type Times News Roman dans laquelle la taille des lettres sera 20,30. Les valeurs TRUE, FALSE, FALSE indique les styles italic non souligné. Je vous invite à voir les autres options sur MSDN (options notament liées à l'orientation du texte correspondant ici aux paramètres 50,50.
SelectObject(hDC, (HGDIOBJ) Font); //Utilise cette font créee pour les TextOut qui suivent.


Voilà pour ce qui est de l'écriture de textes dans une fenêtre avec WM_PAINT. A noter que WM_PAINT sert aussi pour le dessin de tout autre graphique.
Bon courage.
19 janvier 2006 02:51:41 :
mise à jour faite suite aux constatations évoquée dans les commentaires.
  • signaler à un administrateur
    Commentaire de BruNews le 19/01/2006 00:07:26 administrateur CS

    hDC = GetWindowDC(hFenetre); que fait cela ici ???
    PAINTSTRUCT Ps;
    hDC = BeginPaint(hFenetre, &Ps);
    d'où vient ce 'hFenetre' ??? c'est hwnd, 1er param de la winProc.

    Quand on traite WM_PAINT on ne repasse pas à DefWindowProc() mais on retourne 0.

    while (!stop) ??? Ouate Isis ??? (en english...)
    à changer en:
    while(GetMessage(....)) {
      TranslateMessage(...);
      DispatchMessage(...);
    }

    A remanier en profondeur.

  • signaler à un administrateur
    Commentaire de max12 le 19/01/2006 02:26:19 administrateur CS

    L'idée est bonne mais il y a des ptit problème à regarder :( Bon te reste qu'a suivre les conseils de brubru et d'éventuel autres posteurs. Je reviendrai voir plus tard.

    A+

  • signaler à un administrateur
    Commentaire de LaPatoshe le 19/01/2006 02:32:44

    salut. En fait, j'ai repris l'ancien listing du tuto 1 et effectivement, m^me si le prog fonctionne comme ça, il y a quelques trucs qui peuvent sauter aux yeux de par leur inutilité et le gaspillage de ressources qu'ils entrainent (while stop par exemple). Pour ce qui est de hFenetre, j'ai directement utilisé le Handle de la fenêtre crée et non son paramètre passé en WinProc. C'est vrai qu'il semble beaucoup plus logique d'utiliser le paramètre hWnd.
    Dès que j'aurai une minute ou deux, je ferai une petite mise à jour.
    A+

  • signaler à un administrateur
    Commentaire de hugues7E5 le 29/01/2006 19:03:18

    toujours simpa de lire tes tutos, mais heureusement que BruNews est là pour corriger les erreurs!

    Apres correction, ça marche.

    Merci.

  • signaler à un administrateur
    Commentaire de Chubab le 10/05/2006 04:44:55

    jai bien aimé cette source, mais j'ai toujours la même erreur quand je build ce programme dans visual studio....

    Deleting intermediate files and output files for project 'win app - Win32 Debug'.
    --------------------Configuration: win app - Win32 Debug--------------------
    Compiling...
    win app.cpp
    Linking...
    LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
    Debug/win app.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.

    win app.exe - 2 error(s), 0 warning(s)

    Savez-vous pourquoi??...Merci!

    PS: j'aimerais voir le premier tutoriel aussi...je ne le trouve pas...

  • signaler à un administrateur
    Commentaire de LaPatoshe le 11/05/2006 02:14:55

    salut. Ne travaillant pas avec le C++.Net, si c'est avec cette version que tu as des problèmes, je ne vois pas trop d'où cela peut venir. D'après le message d'erreur, on dirait qu'il faille que tu enlèves des fichiers intermédiaires (peut être des fichier générés automatiquement lors de la création de ton appli et entrant en conflit avec #include <windows.h> du programme) encore que je n'en soit pas sûr.
    Sinon, le tutorial 1 est à l'adresse suivante :
    http://www.cppfrance.com/codes/CPLUSPLUS-SOUS-WINDOWS-SANS-MFC-TUTORIAL_24022.aspx
    A+

  • signaler à un administrateur
    Commentaire de BruNews le 11/05/2006 10:07:15 administrateur CS

    Faut faire un projet Win App GUI et non pas console.

  • signaler à un administrateur
    Commentaire de Chubab le 11/05/2006 20:09:08

    salut! jai reussi à compiler! je ne savais tout simplement pas que nous devions etre dans un project win32! dsl!

    quand je nutilise pas while(!stop) par contre jessaye de fermer le programme...mais il continue a rouler dans le background et prend tout mon cpu(ce qui nest pas le cas avant que je passe par WM_DESTROY)...je dois ensuite le fermer a laide de ctrl-alt-del...

    quelqu'un sait pourquoi??
    Merci,
    CHUBAB!

  • signaler à un administrateur
    Commentaire de BruNews le 11/05/2006 20:56:08 administrateur CS

    La forme générale de la pompe à message est:

    while(GetMessage(&msg, 0, 0, 0)) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }

    Si tu as PostQuitMessage(0); de correctement mis alors ça sort à tout coup.
    Variable 'stop' est absolument à supprimer.

  • signaler à un administrateur
    Commentaire de Chubab le 11/05/2006 22:14:20

    Merci BruNews,
    j'ai trouver le probleme...c'est pcq PostQuitMessage(0) est dans WM_DESTROY alors quil devrait etre dans WM_CLOSE!
    Et voila!,
    Chubab!

  • signaler à un administrateur
    Commentaire de tennisdev44 le 15/04/2007 07:23:02

    Bonjour,
    Quand je place PostQuitMessage(0) dans WM_DESTROY, le programme ne se ferme pas complètement. Quand je le met dans WM_CLOSE ça ne change rien...
    Je travaille sous dev c++ en projet Win 32 GUI


    Sauriez vous pourquoi le programme ne se ferme pas complètement?

  • signaler à un administrateur
    Commentaire de LaPatoshe le 15/04/2007 18:07:03

    Bonjour, cela veut il dire que la fenêtre se ferme, mais que le programme tourne toujours et apparait encore de ce fait dans les processus actifs de Windows ?

  • signaler à un administrateur
    Commentaire de akadis le 11/10/2007 17:23:18

    Bonjour, je travaille sous Visual C++ et je rencontre aussi ce problème. C'est à dire que lorsque je ferme la fenêtre soit en cliquant sur la croix, soit en cliquant sur l'icône puis en faisant Fermer, la fenêtre disparait mais le processus tourne toujours.
    Existe t'il un façon "propre" (sans killer le processus) pour terminer l'application ?

  • signaler à un administrateur
    Commentaire de LaPatoshe le 11/10/2007 22:50:20

    Bonsoir, il y a un moment maintenant que j'avais écrit ce code, essaies de voir ce que cela donne en enlevant les return 0 de la partie des traitement des messages.
    Ainsi, le retour de boucle se fera en renvoyant les paramètres DefWinProc.

  • signaler à un administrateur
    Commentaire de akadis le 12/10/2007 00:56:23

    Dans la boucle d'écoute des évènements si on remplace le
    while (GetMessage(&MessagesAEnvoyer, hFenetre, 0, 0))
    par
    while (GetMessage(&MessagesAEnvoyer, NULL, 0, 0))
    Ca résoud le problème :)

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS