IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[Fenêtre avec skin perso] Drag pas assez rapide à effectuer


Sujet :

Windows

  1. #1
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut [Fenêtre avec skin perso] Drag pas assez rapide à effectuer
    Bonjour,

    J'ai toujours eu dans mes fenêtres possédant un skin perso (application d'une région sur une fenêtre à partir d'un bitmap, puis affichage du bitmap dessus) un problème de drag de celles-ci : quand on bougeait la fenête, un geste rapide et le curseur sortait de la fenêtre, ne pouvant y re-rentrer que de la même manière.

    J'explique ma méthode :
    • Déclaration de variables RECT et POINT, ainsi que BOOL
    • Enclenchement d'un timer pseudo-permanent (intervalle = 0ms)
    • Si un évènement WM_LBUTTONDOWN est reçu, le booléen passe à TRUE
      [le curseur en croix est chargé]
    • Par inversement, si WM_LBUTTONUP est reçu, il passe à FALSE
      [le curseur normal est chargé]
    • A chaque timer, si le booléen est à TRUE, on récupère la position de la souris dans le POINT, on lui ajoute les coordonnées de la fenêtre (récupérées dans le RECT), et enfin, on change la position de la fenêtre avec ces coordonnées.


    Auriez-vous une autre méthode, ou une précision pour pouvoir effectuer le drag plus rapidement ? Par exemple, MSN ou WMP restent "collés" à la souris, sans le moindre écart de pixel... comment "font-ils" ?

    Merci d'avance.
    Vive l'embarqué.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je pense que WinAmp colle naturellement à la souris en traitant les messages de "Zone non-client" :
    WM_NCCALCSIZE qui définit le rectangle client,
    WM_NCPAINT pour dessiner le reste,
    Et surtout WM_NCHITTEST qui devrait te permettre ce que tu veux: dire à Windows: "Ça c'est la barre de titre, tu peux l'utiliser pour déplacer la fenêtre".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Et donc, que dois-je faire niveau code ? (donne moi s'il te plaît la méthode, tout du moins)

    Edit : en effet, traduire l'anglais de msdn ne pose pas de problème, mais je ne comprends pas très bien à quoi sert WM_NCHITEST, et quand l'envoyer (je n'ai pas regardé les autres encore)
    Vive l'embarqué.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai parlé de TRAITER le message WM_NCHITTEST, pas l'envoyer...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    D'accord. WM_NCHITTEST suffit, ou je dois utiliser le reste ?

    Je ne vois pas en quoi il va m'aider : ce message est envoyé à la fenêtre sous le curseur lors d'un évènement souris, qu'il soit de type 'motion', ou 'click". Or, apparemment il n'y a pas moyen de récupérer le type d'évènement. Donc je suppose que je devrais l'utiliser seulement pour récupérer les coordonnées du curseur.

    Donc, il a le même rôle que la combinaison GetCursorPos() + GetWindowRect(), non ?

    Peux-tu alors m'expliquer ce que tu ferais à ce sujet ?

    Merci d'avance.
    Vive l'embarqué.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce que je ferais, c'est assez simple:
    je retournerais HTCAPTION pour les parties de ma fenêtre dont je veux qu'elle servent à la déplacer (il faudra peut-être aussi intercepter le bouton droit (WM_NCRBUTTONDOWN) pour empêcher qu'un clic-droit sur ta fenêtre t'affiche son menu système... (ou lui retirer carrément le style WS_SYSMENU)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Donc en gros, dès réception de WM_NCHITTEST, il faut vérifier que la position du curseur contenue dans le lParam est bien contenue dans une zone non-active (pas sur un bouton ou sur une listbox, slider etc., donc), et si c'est le cas, retourner HTCAPTION, c'est ça ?

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    case WM_NCHITTEST:
    {
       POINT pos;
       pos.x = GET_X_LPARAM(lParam);
       pos.y = GET_Y_LPARAM(lParam);
    
       BOOL captionArea = TRUE;
    
       for(int i = 0 ; i < NUMBER_BUTTONS ; i++)
       {
           if(_buttons[i].isMouseOver(pos))
               captionArea = FALSE;
       }
    
       if(captionArea == TRUE)
          return HTCAPTION;
       else
          return HTCLIENT; //Edit
    }
    Vive l'embarqué.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu veux que toute partie non-active soit déplaçable, oui.

    Pour le reste, tu peux retourner HTCLIENT...

    Et si ta fenêtre a des bordures redimensionnables, tu pourras retourner HTLEFT/etc. sur ces bordures...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    N'y aura-t-il pas un problème d'optimisation ? Puisque cette notification est envoyée lors d'un évènement souris, tous les calculs seront relancés à chaque fois que la souris bouge...non ?
    Vive l'embarqué.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu peux toujours te faire un bitmap "masque" indiquant les zones "déplaçables" (construit à partir des masques de tes boutons) au début et consulter le masque à chaque WM_NCHITTEST...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Est-ce que le consulter est plus rapide que de refaire les calculs ?

    Et puis, il faut que je sache comment gérer les masques, puisque ce n'est toujours pas le cas... je n'ai toujours pas réglé le problème des boutons "hovers", car je n'ai pas le skin encore.
    Vive l'embarqué.

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut Voilà ce que je veux dire par masque
    Un petit bitmap monochrome + GetPixel() --> La seule chose "lente" là-dedans à mon avis, c'est une multiplication.

    Et si tu utilises déjà un masque non-monochrome de la taille de la fenêtre pour tes boutons WindowLess, tu peux utiliser le même masque...

    Ici, un exemple: Trois boutons, avec des couleurs spécifiques sur le masque. La zone où il n'y a aucun contrôle WindowLess est, c'est l'ensemble des pixels de couleur 0 (blanc).
    NOTE: Mon exemple limite le masque à la zone client (client area) de la fenêtre. Mais c'est la même chose pour une fenêtre sans bordure...
    Images attachées Images attachées  
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Je crois comprendre le principe... en gros, je me définis une couleur de masque pour chaque bouton, ensuite je crée le masque (pas obligatoirement dans un code, avec paint par exemple), et lors de WM_NCHITTEST :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    case WM_NCHITTEST:
    {
       POINT cursorPos;
       cursorPos.x = GET_X_LPARAM(lParam);
       cursorPos.y = GET_Y_LPARAM(lParam);
    
       BOOL captionArea = TRUE;
    
       for(int i = 0 ; i < NUMBER_BUTTONS ; i++)
       {
           if(_buttons[i].isMouseOver(pos))
               captionArea = FALSE;
       }
    
       if(captionArea == TRUE)
          return HTCAPTION;
       else
          return HTCLIENT; //Edit
    }
    //Où isMouseOver = :
    BOOL Button::isMouseOver(POINT cursor)
    {
       HDC hdc;
       SelectObject(hdc, _maskBmp);
    
       return (GetPixel(hdc, cursor.x, cursor.y) == _rightColor)?TRUE:FALSE;
    }
    A mon avis, il ya une erreur... sinon, ny a-t-il une méthode que tu préfères à celle-ci ?
    Vive l'embarqué.

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Là, tu as mis une image de masque pour chaque bouton...

    Moi, je te parle d'un seul masque pour toute la boîte de dialogue. Tu as juste UN test de pixel à faire: Couleur du fond ou couleur autre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    En fait je pensais à ce que _maskBmp soit hérité de la classe de base, mais en fait il vaut mieux qu'il soit dans le même bloc d'instruction que l'instance de ces boutons.

    En fait, je compte faire une dll d'affichage contenant les classes. Seulement, comment puis-je faire d'après toi ? Charger des fonctions, d'accord, mais pour utiliser des méthodes d'objet ? Dois-je obligatoirement faire une fonction retournant l'adresse d'un objet instancié, ou encore déclarer cet objet en variable globale ? A ce moment là, comment le récupérer ?

    [Edit2: En les déclarant static, cela marcherait-il ?]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    //includes
    
    HRGN BmpToRgn(HBITMAP bmp, COLORREF transparencyColor = 0);
    
    using namespace std;
    
    class PlayerDll
    {
       public:
           PlayerDll();
           ~PlayerDll();
    
           RECT GetDimensions();
           HBITMAP GetSkin();
           HRGN GetRegion();
           HBITMAP GetMask();
    
       private: 
           RECT _dimensions;
           HBITMAP _skin, _mask;
           HRGN _region;
    };
    
    class ButtonsDll
    {
       public:
            ButtonsDll();
            ~ButtonsDll();
    
            RECT GetDimensions(int index);
            HBITMAP GetSkin(int index, int state);
    
       private:
             RECT _dimensions[BUTTONS_NUMBER];
             HBITMAP _skins[BUTTONS_NUMBER][3];
    };
    
    HRGN BmpToRgn(HBITMAP bmp, COLORREF transparencyColor = 0)
    {
       //...
    }
    Merci d'avance.

    [Edit: En fait, j'aurais dû poster ça dans mon topic sur la dll de stockage ressource...]

    P.S: Et sinon, ce que j'avais mis était bon ?
    Vive l'embarqué.

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je te déconseille les variables globales: Retourner l'adresse d'un objet instancié me parait mieux.

    Si tu veux pouvoir utiliser les objets de ta DLL depuis le C, je te conseille de t'inspirer de COM: Déclares des interfaces avec DECLARE_INTERFACE et le programme utilisateur pourra faire ce qu'il veut avec, en C comme en C++...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Sauf que moi, je code en C++ dans mon programme. Donc pas besoin de DECLARE_INTERFACE non ?

    Donc, je dois faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    PlayerDll getPlayerDllInstance()
    {
       PlayerDll *player = new PlayerDll();
    
       return player;
    }
    
    ButtonsDll getButtonsDllInstance()
    {
       ButtonsDll *buttons = new ButtonsDll();
    
       return buttons;
    }
    
    //Avec ce que j'ai mis plus haut
    Dans la dll, puis dans le programme (exemple de fonction) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void Player::setDimensions()
    {
       _dimensions = getPlayerDllInstance()->getDimensions();
    
       return;
    }
    C'est ça ?
    Vive l'embarqué.

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Oui, tu peux faire comme ça, mais en appelant tes fonctions Create() et non Get().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Hmm, d'une certaine manière, oui

    En tout cas, je pense que je devrais me débrouiller ainsi.

    Pour le moment, c'est théorique, puisque je n'ai pas commencé le codage, donc si j'ai des problèmes je reposte...

    Merci beaucoup Médinoc
    Vive l'embarqué.

  20. #20
    Membre confirmé Avatar de Issam
    Inscrit en
    Mars 2002
    Messages
    578
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2002
    Messages : 578
    Points : 604
    Points
    604
    Par défaut
    en delphi dans l'évenement OnMouseMove

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if shift=[ssleft] then
    begin
     ReleaseCapture;
     Perform(WM_sysCommand,$F012,0);
    end;

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/07/2011, 21h01
  2. [Batch] Ouvrir une fenêtre DOS avec taille perso ET petit ascenseur
    Par Azerty32 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 17/08/2010, 14h51
  3. Double boucle imbriquée pas assez rapide.
    Par Bruno13 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 16/06/2008, 21h01
  4. Réponses: 5
    Dernier message: 14/05/2008, 18h14
  5. JVCL 3.3 pas encore compatible avec édition perso
    Par Okaryn dans le forum Delphi
    Réponses: 2
    Dernier message: 28/01/2007, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo