begin process at 2008 07 20 13:44:06
1 213 234 membres
151 nouveaux aujourd'hui
14 166 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 !

[FLASH] RÉALISATION DE FENÊTRES DRAGABLES EN AS2 AVEC REDIMENSIONNEMENT AUTOMATIQUE DU CONTENU ET GESTION DE LA PROFONDEUR.


Information sur le tutorial

Catégorie :Tutoriaux Date de création : 15/07/2005 19:39:57 Vu : 15 762 fois

Note :
9,3 / 10 - par 10 personnes
9,30 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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


Description

Dans ce tuto vous allez apprendre a créer des fenêtres (style Windows) dans lesquels vous pourrez charger un clip (en swf ou jpeg).

Tutorial

 

Creation le 13/07/2005.

Utilisation libre pour projets non lucratifs.

 

Si vous créez vos propres sources à partir de ce tuto, ces sources vous appartiennent et vous êtes libres d’en faire ce que bon vous semble.

 

  

I) Graphismes :

 

La fenêtre va être composé de 2 parties :

 

-         la barre de titre (celle sur laquelle il faudra cliquer pour déplacer la fenêtre)

-         Le fond de la fenêtre.

 

Ouvrez flash, cliquez sur fichier -> Nouveau -> Document Flash.

 

 

Nous allons ajouter le clip qui contiendra la fenêtre :

 

Cliquez sur insertion -> Nouveau symbole, nommez le fenetre1.

 

 

 

Dessinez votre fenêtre comme bon vous semble, ici la fenêtre sera dessiné simplement :

 

 

Maintenant il faut comprendre comment cela va fonctionner :

 

La fenêtre doit être séparé en 2, une partie servira à afficher le titre et à la bouger, l’autre affichera le clip chargé. C’est pour cela qu’il faut couper la fenêtre maintenant.

 

 

Sélectionnez la barre de titre avec la souris, comme sur l’image (n’oubliez pas de prendre la ligne du bas)

 

 

 

 

Cliquez sur modification -> convertir en symbole

 

Appelez ce nouveau symbole « barre »

 

Créez un nouveau calque et appelez le LyBarre

Coupez collez la barre dans ce calque.

 

 Dans le panneau propriété la ou il est inscrit nom de l’occurrence écrivez « barre » (c’est avec ce nom que nous pourront ajouter du code par la suite)

 

 

Prenez le reste de la fenêtre et convertissez le en symbole, appelez le « intérieur »

Renommez le calque dans lequel est le clip intérieur LyInterieur.

 

Dans le panneau propriété la ou il est inscrit nom de l’occurrence écrivez « interieur » (c’est avec ce nom que nous pourront ajouter ducode par la suite)

 

 

 

 

 

Vos calques ressemblent a ceci :

 

 

 

 

 

Voila nous avons nos deux parties de fenêtres, si vous les aviez séparé remettez les ensemble.

 

 

II) La barre de titre Dragable.

 

Double cliquez sur la barre de titre (« barre »).

Vous vous trouvez à l’intérieur de la barre de titre. Créez un calque nommé titre, cliquez sur la première image du calque et choisissez l’outil texte.

Créez une zone de texte sur le long de la barre de cette façon :

 

 

Et mettez dans les propriétés texte dynamique, comme nom « titre », une seul ligne et décochez la case « sélectionnable » :

 

 

 

 

La barre de titre est prête pour l’action ;)

 

 

 

 

 

III) Le clip « interieur »

 

Imaginez la fenêtre vue de coté.

La barre de titre est au niveau le plus haut (car on a placé son calque au dessus du calque interieur)

Ensuite vient « interieur » ici en rouge.

 

Interieur va contenir deux choses importantes :

Le clip « contenu » que nous allons créer et qui accueillera le swf que l’on va charger.

Et le clip fond, qui sera l’image de fond ou la couleur de fond mais qui est indispensable pour 2 raisons :

-         Si on ne met pas de clip fond en dessous du swf chargé les parties transparentes du swf laisseront voir les graphismes qui se trouvent en dessous de la fenêtre

-          Si on n’utilise pas une technique cachée (handCursor no justu -_-) les éléments cliquables de l’animation le resteront même si la fenêtre est au dessus.

 

Faites un essai sans utiliser de clip fond pour constater les problèmes que cela apporte.

 

 

 

Double cliquez sur le clip interieur si cela n’est pas déjà fait.

 

Il va falloir séparer les contours de la fenêtre du reste pour qu’ils restent visibles même après le chargement du swf.

 

Sélectionnez les, faites couper, créez un nouveau calque nommé « contour » et placez le au dessus de tous les autres, et collez les contour (coller en place).

 

Appelez le calque ou il reste le remplissage « fond ».

 

Sélectionnez le remplissage de fond et faite Modification -> Convertir en symbole.

Appelez-le « fond » …

 

Voila ce que ça donne :

 

 

 

 

 

 

Créez un nouveau calque, entre le calque contours et le calque fond, appelez le contenu. Maintenant cliquez sur Insertion -> Nouveau symbole et nommez le « conteneur ».

Ce clip reste vide, et recevra les swf à charger.

Revenez dans le clip interieur.

Il faut maintenant glisser déposer le clip « conteneur » dans le calque « contenu » et le placer au coin haut gauche du clip fond. Nommez le « conteneur ».

Petite image pour ceux qui n’ont pas suivi…

 

 

 

 

 

Maintenant que l’on a un clip pour charger le clip externe, il va falloir réfléchir un peu. Si le clip est de la même taille ou plus petit que le clip fond (la taille de la fenêtre) il ne devrait pas y avoir de problème (on pourra quand même vouloir que le clip s’adapte a la fenêtre c’est ce que l’on fera dans le code).

Par contre si le clip est plus grand que la fenêtre, il va dépasser, et là si il n’est pas redimensionné (dans le cas d’utilisation de scrollBar), il faudra que les parties qui dépassent la fenêtre soient invisibles.

On va donc utiliser un masque sur le calque contenu qui va permettre de cacher automatiquement les parties qui dépassent.

 

Créez un calque et placez le au dessus du calque contenu, cliquez du bouton droit dessus et cliquez sur Masque. Renommez ce calque « MasqueContenu » et débloquez le pour ensuite dessiner un rectangle de la taille du fond de la fenêtre.

 

Voila le résultat:

 

 

 

 

Dernière chose, il faut définir les propriétés de liaison de la fenêtre pour l’utiliser avec ActionScript. Faites ctrl+L pour ouvrir la bibliothèque. Vous devez y voir « fenetre1 ».

Cliquez du bouton droit dessus et cliquez sur Liaison. Cochez « Exporter pour ActionScript » et mettez comme identifiant « fenetreLib ». Grâce a cette démarche, on va pouvoir depuis ActionScript utiliser attachMovie pour placer dynamiquement le clip sur la scène.

 

 

Nous avons maintenant une fenêtre prête à être scriptée.

L’ajout de scrollBar pour le cas de non redimensionnement des clips externes sera abordé à une date ultérieure (ou jamais -_-)

 

 

IV) L’ActionScript.

 

Si vous avez Macromedia Flash MX 2004 pro faites Fichier -> Nouveau -> Fichier Action Script

 

Sinon téléchargez un éditeur de code comme Sephy : http://www.sephiroth.it/python/sepy.php

 

On va commencer par choisir le nom de la classe que l’on va créer. Pourquoi pas Fenetre ?

Faites fichier -> enregistrer sous, et placez le fichier (Fenetre.as) dans le même dossier que votre animation principale.

 

 

Maintenant que le fichier de classe est crée il faut coder !

 

Ma connaissance de la programmation orientée objet n’est pas parfaite,  il peut très bien y avoir du code inutile ou trop lourd, si vous avez des critiques (bonnes ou mauvaises) je les accepterais avec plaisir.

 

Voici la présentation de la classe Fenetre :

 

La classe Fenetre aura des attributs et des méthodes d’occurrence mais aussi statiques (des méthodes qui ne pourront pas êtres appelées à partir d’une occurrence mais pour la classe elle-même).

Par exemple, le movieClipLoader (qui sert à charger le clip externe dans« conteneur ») sera statique, car un seul suffit pour toutes les fenêtres et ce serait utiliser de la mémoire pour rien que de doter chaque fenêtre d’un MCL.

 

Si vous êtes perdu après avoir lu le paragraphe précèdent, cela va être difficile d’aller plus loin, essayez de vous familiariser avec les classes et tout ce qui s’y rapporte en ActionScript en trouvant des tutoriaux ou en achetant un livre sur le sujet (je vous conseil « Le meilleur d’ActionScript 2.0 » de Colin Moock de l’éditeur O’Reilly®)

 

 

Voici un rapide aperçu de ce que contient la classe Fenetre :

 

 

 

Réalisé avec gModeler (http://www.gModeler.com)

 

 

 

Attributs :

 

instance : c’est le lien vers le clip qui va être placer sur la scène.

 

mcl : C’est le MovieClipLoader de la classe, il va être utilisé par chaque fenêtre pour charger son contenu. Il est statique.

 

mclLst : c’est l’écouteur de mcl (pour les événements onLoadInit, onLoadError etc…)

 

Méthodes :

 

Fenetre : c’est la méthode constructeur, celle qui est appelée lorsque l’on créera une nouvelle fenêtre a l’aide de new. Cette fonction est détaillé en dessous

 

getSuperMcl : cette méthode retournera le movieClipLoader statique de la classe, pour le chargement des clip.

 

gotoFirstPlan : cette méthode d’occurrence est utilisée pour faire passer la fenêtre au premier plan si elle est sélectionnée alors qu’une autre fenêtre est au dessus d’elle.

 

load : cette méthode permettra de charger un clip dans conteneur en changeant aussi le texte de la barre de titre.

 

 

 

 

 

1)     Fenetre : la méthode constructeur.

 

La fonction constructeur permet d’initialiser l’occurrence de la classe, elle est appelée quand on utilise un new. On aura une fonction constructeur du type :

function Fenetre(nom:String,  // C’est le nom que la classe donnera au clip de la fenêtre

                           conteneur:MovieClip,//C’est le clip dans lequel va être attaché le clip fenêtre

                           clip:String,//C’est le nom de liaison du clip dans la bibliothèque (utilisé avecattachMovie)

                           titre :String,//le titre qui s’affichera dans la barre

                           swf :String,//le swf a charger.

                           defaultX:Number,//La position horizontale par défaut

                           defaultY:Number,//La position verticale par défaut

                           dragable:Boolean//Booléen spécifiant si la fenêtre est déplaçable

                            )

 

 

Pour créer une nouvelle fenêtre il faudra donc utiliser la ligne de code :

maFenetre:Fenetre = new Fenetre("fenetre1", _root, "fenetre1", "KatiePrice", "13.jpg", 20, 20, true);

pour une fenêtre qui sera attaché sur la base de l’animation et qui sera positionné a x = 20 et y = 20.

 

Dans cette fonction, il faudra tout d’abord attacher le clip fenetreLib qui se trouve dans la bibliothèque, puis le placer a l’emplacement fourni en paramètre, et utiliser les événements de souris onPress et onRelease pour le déplacement manuel de la fenêtre.

Voila le code :

 

            function Fenetre(nom:String, conteneur:MovieClip,clip:String,  titre :String, swf :String,defaultX:Number, defaultY:Number, dragable:Boolean) {

                        

                       // On attache la fenetre

                       this.instance = conteneur.attachMovie(clip, nom, conteneur.getNextHighestDepth());

 

                       // on place la fenetre

                       this.instance._x = defaultX;

                       this.instance._y = defaultY;

                       //

                       // --- Les evenements de souris ---

                       //

                       this.instance.interieur.fond.useHandCursor = false;

//C’est la technique « handCursor no jutsu » dont je vous parlez plus haut dans ce tuto, et c’est pour utiliser cette technique que l’on a créée un clip « fond ». Elle sert en fait à faire comme si le fond était cliquable pour éviter que ce qui est en dessous de la fenêtre ne le soit, mais la main est cachée. C’est de la bidouille et si quelqu’un a une meilleur technique veuillez m’en faire part.

 

 

                     if(dragable){ //si la fenetre est deplacable:

                                  this.instance.barre.onPress = function() {

                                              this._parent.startDrag(false); // On commence a déplacer a l’événement onPress

                                              

                                              Fenetre.gotoFirstPlan(this._parent); // ici on passé au dessus des autres fenêtres (fonction étudiée plus bas)

                                  };

                                  this.instance.barre.onRelease = function() {

                                              this._parent.stopDrag();

                                  };

                        }

                       this.load(titre, swf); // La fonction load est expliqué juste en dessous.

            }

 

 

 

 

 

2)     Load : la fonction chargement.

 

La fonction load est très simple, elle va juste changer le texte dans labarre de titre (ligne 1) et elle va appeler le MovieClipLoader statique de la classe et lui demander de charger le clip fournit en paramètre dans le clip instance.interieur.conteneur.

 

           

            public function load(titre:String, swf:String) {

                       this.instance.barre.titre.text = titre;

                       Fenetre.getSuperMcl().loadClip(swf, this.instance.interieur.conteneur);

            }

 

 

 

3)     Les fonction statiques.

 

a)      getSuperMcl

 

Cette fonction statique va créer le movieClipLoader et son écouteur si ils n’existent pas, sinon elle va seulement le retourner. Cela permet de n’avoir qu’un seul movieClipLoader pour toutes les fenêtres de la scène.

La fonction onLoadInit de l’écouteur va s’exécuter a la fin du chargement de l’image, c’est a partir de ce moment seulement que l’on peut accéder aux propriétés _width et _height. Ensuite on va calculer le rapport largeur/hauteur du clip pour le redimensionner en conséquence.

 

Finalement on défini l’evenement onRelease du clip pour que quand on clique dessus, la fenêtre passe au dessus des autres.

 

           

                       public static function getSuperMcl():MovieClipLoader {

                       // Si le movieClipLoader n'existe pas on en crée un nouveau ainsi que son ecouteur

                       if (mcl == undefined) {

                                  mcl = new MovieClipLoader();

                                  mclLst = new Object();

                                  mclLst.onLoadInit = function(cible:MovieClip) {

                                              var rapport:Number = cible._width/cible._height;

                                              trace("w = "+cible._width+" h ="+cible._height+" rap = "+rapport);

                                              if (rapport>=1) {

                                                          cible._width = cible._parent.fond._width;

                                                          cible._height = cible._parent.fond._width/rapport;

                                                          cible._y = (cible._parent.fond._height-cible._height)/2;

                                                          cible._x = 0;

                                              } else {

                                                          cible._height = cible._parent.fond._height;

                                                          cible._width = cible._parent.fond._height*rapport;

                                                          cible._x = (cible._parent.fond._width-cible._width)/2;

                                                          cible._y = 0;

                                              }

                                              cible.onPress = function() {

                                                          Fenetre.gotoFirstPlan(this._parent._parent);

                                              };

                                  };

                                  mcl.addListener(mclLst);

                                  return mcl;

                       } else {

                                  return mcl;

                       }

            }

           

 

 

 

 

 

b)      gotoFirstPlan

 

La fonction gotoFirstPlan va passer le clip qu’elle reçoit en paramètre au plus haut niveau de profondeur du clip parent a ce dernier.

 

                       public static function gotoFirstPlan(cible:MovieClip) {

                                   if (cible.getDepth() != cible._parent.getNextHighestDepth()-1) {

                                              cible.swapDepths(cible._parent.getNextHighestDepth());

                                   }

                        }

 

 

 

 

 

Voila vous pouvez maintenant tester votre animation avec plusieurs fenêtres comme ceci par exemple :

 

maFenetre = new Fenetre("fenetre1", _root, "fenetre", "KatiePrice", "13.jpg", 20, 20, true);

maFenetre2 = new Fenetre("fenetre2", _root, "fenetre", "GhostInTheShell", "TopManga_Ghost_In_The_Shell_05.jpg", 20, 20, true);

maFenetre3 = new Fenetre("fenetre3", _root, "fenetre", "Fleur", "VBV95-08.JPG", 20, 20, true);

maFenetre4 = new Fenetre("fenetre4", _root, "fenetre", "AeroFighter", "aero.swf", 20, 20, true);

 

 

 

Le swf pèse 1 450 octets ce qui est assé raisonnable ;)

La source contient:
    -le fichier main.swf
    -le fichier main.fla
    -le fichier de la classe Fenetre : Fenetre.as
    -Les images pour le test

Telechargez la source : ici

Reste a faire :
       - lockRoot pour les swf qui utilisent le mot clée _root.
       - boutton pour fermer les fenetres
       - Boutton pour charger un clip manuellement
       - Autre chose ?

En espérant que mon tuto soit utile a quelques uns d’entre vous.


Liens :

http://www.gModeler.com

http://www.flashkod.com

http://gotoandplay.it

http://cochire.free.fr/monsite/main2.html

15 juillet 2005 19:48:56 :
Correction de quelques fautes de frappe.
15 juillet 2005 19:52:26 :
Idem
15 juillet 2005 20:08:12 :
...
16 juillet 2005 14:55:24 :
idem
16 juillet 2005 15:46:05 :
Ajout de la source du code.
16 juillet 2005 18:02:48 :
corrections diverse
16 juillet 2005 18:31:49 :
...
16 juillet 2005 18:45:43 :
Encore ce bug d'espaces...
  • signaler à un administrateur
    Commentaire de Prouprou_Sensei le 16/07/2005 18:10:31

    Ya des corrections qui ont étés faites mais le tuto ne se met pas a jour...
    Le site c'est : http://cochire.free.fr/monsite/main2.html
    J'ai oublié deux parametres dans la fonction constructeur (titre et swf)
    Et j'ai ajouté la source... que vous pourrez telecharger quand le tuto se mettra a jour.

    A tchao !

  • signaler à un administrateur
    Commentaire de Prouprou_Sensei le 16/07/2005 18:33:48

    En fait le tuto se met a jour quand il y a un commentaire...
    J'ai corrigé un bug qui s'etait produit a la derniere mise a jour, les espaces avaient étés enlevés (pff)

  • signaler à un administrateur
    Commentaire de Prouprou_Sensei le 16/07/2005 20:46:20

    Encore des corrections de bugs, j'espere que cette fois ci ca va fonctionner....

  • signaler à un administrateur
    Commentaire de Prouprou_Sensei le 16/07/2005 20:48:32

    Conclusion, n'utilisez pas FireFox pour faire ou editer vos tutos....

  • signaler à un administrateur
    Commentaire de Mafassure le 04/08/2005 16:44:44 administrateur CS

    salut
    un tuto digne de ce nom, trés didactique (même sans les img)...
    un grand merci

    PS : si t'en à d'autre sous le coude (AS2)

  • signaler à un administrateur
    Commentaire de Mafassure le 04/08/2005 16:46:29 administrateur CS

    ???? !!!!!
    après avoir posté mon commentaire les images s'affiches
    =O)

    ciaooo

  • signaler à un administrateur
    Commentaire de Prouprou_Sensei le 04/08/2005 19:03:54

    Le systeme de tuto du site a l'air buggé, en tout cas merci pour le commentaire ;)
    A tchao !

  • signaler à un administrateur
    Commentaire de nhh_the_matrix le 20/08/2005 21:28:28

    Bravo pour le tutorial même si je n'ai même pas encore essayé de l'appliquer. D'ailleurs, voici un lien qui met en application ce système de fenêtres dragables : http://www.muse.mu/, le site officiel du groupe de rock.

    Sinon, je voulais savoir quelle était la version de Flash avec laquelle tu as fait le fichier .fla source?? Je n'arrive pas l'ouvrir avec Flash MX 6.0 r25...

    Merci!

  • signaler à un administrateur
    Commentaire de Napster le 27/08/2005 16:38:04

    salut ,
    ben vraiment un beau tuto pour le design ce que je chercher tt le temp ces genres de tuto , merci a toi
    bonne continuation si ta d'autres , glisse nous un peu de muet ;-)

  • signaler à un administrateur
    Commentaire de loicloicloic le 03/09/2005 21:45:55

    Je suis débutant donc un pose une question de débutant ;-), je ne comprends pourquoi quand je règle "Classe AS 2.0 : Fenetre" dans les   propriétés de liaison les évènements souris ne fonctionnent plus.
    D'avance merci.
    Loïc

  • signaler à un administrateur
    Commentaire de Prouprou_Sensei le 03/09/2005 22:00:38

    Les classes représentées ici sont des classes qui utilisent la composition (la classe possede un clip), ce n'est pas un heritage.
    Or lorsque tu regle la classe action script d'un clip, il faut obligatoirement que la classe soit une sous classe de MovieClip.
    Donc tu ne dois pas toucher a l'onglet Classe AS2 dans les propriétées de ton movieClip, mais juste mettre le nom de liaison du movieClip dans la fonction constructeur (le parametre clip).
    A tchao !

  • signaler à un administrateur
    Commentaire de BirD le 06/12/2005 11:16:27

    Hello, je voudrais juste savoir, une fois que notre fenetre est ouverte, comment faire pour la fermer ? merci d'avance.

  • signaler à un administrateur
    Commentaire de Dorian8821 le 23/02/2006 01:27:45

    Pour ajouter un bouton fermer a la fenetre il suffit de creer un nouveau calque en premier plan sur le clip Barre ensuit programmer le avec :

    on (release) {
        setProperty("/fenetre", _visible, "0");
    }

    C'est tout! (attention au nom de la fenetre)

    Pour creer un bouton de lancage manuel de la fenetre comme la sugeré le talentueux auteur de ce tuto (manifique) , programmez le clip fenetre avec :

    onClipEvent (load) {
    setProperty("/fenetre", _visible, "0");
    }

    puis creez en début de sequence un bouton a programmer avec :

    on (release) {
    setProperty("/fenetre", _visible, "-1");
    }

    Desolé je ne de ne pas etre aussi clair que Prouprou_Sensei

    En esperant que cela vous servirat.

  • signaler à un administrateur
    Commentaire de Prouprou_Sensei le 26/02/2006 19:45:21

    bien que ce soit sympa de donner un code en exemple pour bird, c'est mauvais de donner une syntaxe genre flash 4.
    Donc meme si vous ne voulez pas rentrer dans les classes pour changer le code, je vous recommande plutot :

    fenetre._visible = false;
    ou
    fenetre._visible = true;

    a la place de setProperty("/fenetre", _visible, valeur)

    a tchao !

  • signaler à un administrateur
    Commentaire de BirD le 15/03/2006 18:01:56

    merci, mais en fait, c'est pas ce que je cherche exactement. J'aimerais faire un unloadmovie sur la fenetre, mais je ne sais pas comment faire... merci d'avance

  • signaler à un administrateur
    Commentaire de BirD le 15/03/2006 18:08:02

    car par exemple, si je met sur mon anim un bouton avec ce texte :
    on (press) {
    unloadMovie(_root.fenetre2);
    }
    fenetre 2 aura bien disparue. mais quand je la rapelle, ma fenetre se charge mais elle est vide...

  • signaler à un administrateur
    Commentaire de gurdil63 le 15/06/2006 16:07:51

    Très beau code !
    Par contre je voudrais savoir si on pourrait faire en sort que les fenêtres s'ouvrent lorsqu'on appuie sur un bouton ?
    Genre en remplacement des pop-up (rassure toi je ne suis pas un publicitaire).
    Merci encore pour ce très bon code

  • signaler à un administrateur
    Commentaire de Rudy3212 le 09/07/2006 14:45:26

    Comment fait-on pour mettre du Texte dans les Fentre et non Des Images
    Car je suis vraiment TRES TRES TRES etc... debutant :)


    Merci D'avance

  • signaler à un administrateur
    Commentaire de Rudy3212 le 09/07/2006 14:49:04

    Vraiment excuse moi lol j'ai trouvé :)

  • signaler à un administrateur
    Commentaire de zarkofaj le 19/11/2007 22:02:19

    Bien ton tuto. Très appréciable. Agréable à étudier, le jeu des profondeurs, les chargements des données . . . Que dire de plus. C'est très bien. Merci | DM Qc, Canada.

  • signaler à un administrateur
    Commentaire de kouby69 le 30/01/2008 08:53:48

    Salut!

    Super tuto mais je voulais savoir si tu n' as pas le code pour cliké sur un bouton et que sa ouvre une fenetre dragable?

    Merci.

  • signaler à un administrateur
    Commentaire de kouby69 le 30/01/2008 08:55:59

    arf !

    J'ai écris comme un porc !!!

    Pardon!!!

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 !

Boutique

Boutique de goodies CodeS-SourceS