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

MFC Discussion :

[WinCE] Création d'un contrôle graphique + courbe


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut [WinCE] Création d'un contrôle graphique + courbe
    Bonjour @ tous les développeurs,

    Sujet du jour : la création d'un custom controle pour permettre l'affichage d'une courbe.

    Contraintes : Développement en MFC pour Windows CE, IDE eMbedded Visual C++ 4.0.

    Détails :

    - Pour les besoins d'une application de visualisation d'une acquisition, j'ai besoin d'afficher des points sur un graphique.
    - Création d'un Custom Control OK
    - Ajout du Custom Control dans le projet OK
    - Affichage du Custom Control OK
    - Implementation du Custom Control .... Pas OK --> KO.

    Explications :
    - J'ai défini plusieurs variable membres pour les paramètres (Unités, Echelle, Taille, Couleur)

    - Ensuite j'ai défini 2 CDC, un pour la grille et les éléments de celle-ci (m_dcGrid), et l'autre pour la courbe (m_dcPlot).
    Il est évident que le m_dcPlot est plus petit que le m_dcGrid.

    - Quand je place la grille sur mon dcGrid elle s'affiche parfaitement, cependant les points du dcPlot disparraissent ... c'est génant.

    - J'ai alors cherché du coté du BitBlt entre les valeurs SRCAND, SRCPAINT, SRCCOPY ... mais apparament ça ne vient pas de là (si je change rectangle noir apparait)

    - J'ai beau cherché partout, je retombe toujours sur les memes explications floues, Je ne souhaite pas faire quelques choses de compliqué, juste afficher des pixels en guise de courbe ! (SetPixel)

    - Un dessin de que je souhaite faire et du code vous feront surement mieu comprendre :

    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
     
    void CGraph::OnPaint() 
    {
    	CPaintDC dc(this); // device context for painting
     
    	// TODO: Add your message handler code here
    	CDC memDC ;
    	CBitmap memBitmap ;
    	CBitmap* oldBitmap ;
     
    	memDC.CreateCompatibleDC(&dc) ;
    	memBitmap.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight) ;
    	oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap) ;
     
    	if (memDC.GetSafeHdc() != NULL)
    	{
    		memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &m_dcGrid, 0, 0, SRCCOPY) ;
    		memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &m_dcPlot, 0, 0, SRCPAINT) ;
    		dc.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &memDC, 0, 0, SRCCOPY) ;
    	}
     
    	memDC.SelectObject(oldBitmap) ;
    	// Do not call CWnd::OnPaint() for painting messages
    }
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    void CGraph::InvalidateCtrl()
    {
    	CClientDC dc(this) ;  
     
    	CPen *oldPen ;
    	CPen solidPen(PS_SOLID, 0, m_crGridColor) ;
     
    	if (m_dcGrid.GetSafeHdc() == NULL)
    	{
    		m_dcGrid.CreateCompatibleDC(&dc) ;
    		m_bitmapGrid.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight) ;
    		m_bitmapOldGrid = m_dcGrid.SelectObject(&m_bitmapGrid) ;
    	}
     
    	m_dcGrid.SetBkColor (m_crBackColor) ;
    	m_dcGrid.FillRect(m_rectClient, &m_brushBack) ;
    	m_dcGrid.SetTextColor (m_crGridColor) ;
     
    	oldPen = m_dcGrid.SelectObject (&solidPen) ; 
    	m_dcGrid.MoveTo (m_rectPlot.left-1, m_rectPlot.top-1) ;
    	m_dcGrid.LineTo (m_rectPlot.right+1, m_rectPlot.top-1) ;
    	m_dcGrid.LineTo (m_rectPlot.right+1, m_rectPlot.bottom+1) ;
    	m_dcGrid.LineTo (m_rectPlot.left-1, m_rectPlot.bottom+1) ;
    	m_dcGrid.LineTo (m_rectPlot.left-1, m_rectPlot.top-1) ;
    	m_dcGrid.SelectObject (oldPen) ;
     
    	//InvalidateRect(m_rectClient) ;
     
    	if (m_dcPlot.GetSafeHdc() == NULL)
    	{
    		m_dcPlot.CreateCompatibleDC(&dc) ;
    		m_bitmapPlot.CreateCompatibleBitmap(&dc, m_nPlotWidth, m_nPlotHeight) ;
    		m_bitmapOldPlot = m_dcPlot.SelectObject(&m_bitmapPlot) ;
    	}
     
    	m_dcPlot.SetBkColor (m_crBackColor);
    	//m_dcPlot.FillRect(m_rectPlot, &m_brushBack);
     
    	//CPen solidPenPlot(PS_SOLID, 0, m_crPlotColor) ;
    	//oldPen = m_dcPlot.SelectObject (&solidPenPlot);
     
    	m_dcPlot.SetPixel(120,20,m_crGridColor);
    	m_dcPlot.SetPixel(120,21,m_crGridColor);
    	m_dcPlot.SetPixel(121,20,m_crGridColor);
    	m_dcPlot.SetPixel(121,21,m_crGridColor);
     
    	//m_dcPlot.SelectObject (oldPen) ;
    	//InvalidateRect(m_rectPlot) ;
    }
    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
    void CGraph::DrawPlot(int x, int y, COLORREF color)
    {
    	if (x >= this->m_XMax)
    	{
    		this->m_XMax = x+1;
    	}
     
    	if (y >= this->m_YMax)
    	{
    		this->m_YMax = y+1;
    	}
     
    	m_dcPlot.SetPixel(this->m_rectPlot.left+x, this->m_nPlotHeight-y, color);
    	this->InvalidateCtrl();
    }
    Pour ceux qui n'ont pas compris clairement ce que j'ai expliqué plus haut je reformule, avec le code ci-dessus, ça devrait etre plus facile.

    J'ai 2 zones d'affichages, la partie grille dcGrid et la partie courbe dcPlot.
    La zone dcGrid d'affiche bien, par contre la zone dcPlot n'affiche rien (m_dcPlot.SetPixel() qui ne fait rien)

    Qu'est ce que j'ai oublié de faire ?

    Merci de vos réponses, quelles qu'elles soient !

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    a tout hasard ..., un stylo (CPen ) est sélectionné dans DrawPlot ?
    pourquoi deux dc ? ,je ne suis pas sûr que ça fonctionne ...
    autre chose la logique de dessin doit toujours être dans le paint sinon sur un recouvrement tu perds ton dessin.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    Et bien vu que dans SetPixel on spécifie je ne sais pas si il y a vraiment besoin de re-spécifier le CPen.

    Pour en être sur, j'ai testé en ajoutant une sélection de CPen avant le SetPixel et en restaurant l'ancien CPen juste après ... Toujours pareil

    [Edit]J'ai pas répondu a tout

    Pourquoi 2 dc ?, pour séparer le traitement entre la grille et la courbe ...
    Un peu à la manière Barre de titre, Barre de menus, Barre d'outils, Vue, Barre d'etat ...

    Pour le recouvrement j'y ai pensé, et mon problème doit bien venir de là, Fonction BitBlt et le paramètre dwRop (SRCCOPY, SRCAND, SRCPAINT)

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    en fait en regardant ton code je ne comprends pas trop la logique ,
    tu mets des points et après tu fais InvalidateCtrl().

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    La fonction InvalidateCtrl sert à réactualiser le graphique (graphique presque temps-réél), ça ralenti considérablement le traitement, mais pour les tests c'est très pratique.

    Normalement cette ligne disparaitra quand j'aurais terminé tout ça, je n'ai pas besoin d'un affichage temps réél.

  6. #6
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    salut,

    si j'ai bien compris, tu as deux bitmaps opaques, un dans dcGrid et un autre dans dcPlot.
    tu essayes ensuite de les fusionner dans memdc via des BitBlt(), pour finalement l'afficher dans le DC final (PaintDC)

    un peu usine à gaz tout ça ?!

    un bitmap n'est pas transparent, sauf si tu spécifies un canal alpha ou tu créées un masque (image monochrome)

    GDI ne supporte pas le dessin avec un canal alpha (sauf via TransparentBlt() ), vaut mieux donc s'orienter vers un masque, ou alors GDI+

    mais est-ce vraiment utile tout ça ?

    pourquoi ne pas tout dessiner dans le même bitmap ... d'abord la grille puis les points ...

    @+

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    Ok je vais suivre vos conseils, je trouvais ma méthode plus propre ... apparament je me trompais.

    Je vais utiliser un seul dc.

    GDI+ je ne peux pas l'utiliser, je suis sous Windows CE 4.1 et sans Compact Framework, de plus sur mon matériel tous les fichiers et paramètres sont écrasés au démarrage (Dll y compris).

    Merci pour les conseils

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    Bon et mauvais points ...

    Alors en utilisant seulement un seul CDC j'arrive à afficher le rectangle de contour, les string des unités et l'échelle utilisé.
    J'en ai profité pour renommer ma fonction InvalidateCtrl en Draw (plus explicite à mon gout)

    La fonction DrawPlot fonctionne à merveille, par contre j'ai tenté de créer une fonction DrawLine ... et elle on ne peut pas dire qu'elle fonctionne bien :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void CGraphMotoman::DrawLine(int x1, int x2, int y1, int y2, COLORREF color)
    {
    	CPen *oldPen ;
    	CPen pen(PS_SOLID, 0, color);
     
    	oldPen = this->m_dcPlot.SelectObject(&pen);
     
    	this->m_dcPlot.MoveTo( this->m_rectPlot.left + x1, this->m_nPlotHeight - y1);
    	this->m_dcPlot.LineTo( this->m_rectPlot.left + x2, this->m_nPlotHeight - y2);
     
    	this->m_dcPlot.SelectObject(oldPen);
    }
    Je m'arrache les cheveux, Qu'est ce que j'ai oublié ?

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    c'est quoi le problème ?
    d'un point de vue syntaxe il n'y a rien a dire ,ça doit être les coordonnées ou le contexte d'appel ...

  10. #10
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    Ok je montre alors l'appel :

    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
    CRect rect;
    	GetDlgItem(IDC_CUSTOM_GRAPH)->GetWindowRect(rect) ;
    	ScreenToClient(rect) ;
    	GetDlgItem(IDC_CUSTOM_GRAPH)->ShowWindow(SW_HIDE);
     
    	// create the control
    	m_Graph.Create(WS_VISIBLE | WS_CHILD, rect, this, IDC_CUSTOM_GRAPH) ; 
     
    	m_Graph.DrawPlot(10,10,RGB(0,0,0));
    	m_Graph.DrawLine(10,10,45,45,RGB(0,0,230));
     
    	m_Graph.SetBackColor(COLOR_FOND);
    	m_Graph.SetGridColor(COLOR_WHITE_ON);
    	m_Graph.SetTextColor(COLOR_WHITE_ON);
    	m_Graph.SetPlotColor(RGB(255,0,0));
     
    	m_Graph.SetXRange(10,50);
    	m_Graph.SetYRange(10,1);
     
    	m_Graph.SetXUnit(L"Temps en seconde");
    	m_Graph.SetYUnit(L"Couple en Nm");
     
    	CFormView::OnInitialUpdate();

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    hé bien les coordonnées sont les mêmes : 10,10,45,45.
    moveto et lineto sont sur le même point non ?


  12. #12
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    Oups le boulet
    Mais d'une force là

    Bon par contre ça ne fonctionne quand meme pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_Graph.DrawPlot(10,10,RGB(0,0,0));
    	m_Graph.DrawLine(20,25,30,35,RGB(255,0,0));

  13. #13
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    je ne vois rien d'anormal dans ton code ...
    comment construis-tu le dcPlot ? peux tu nous montre le code
    et pour l'affichage final, tu fais bien un BitBlt() du dcPlot vers le PaintDC directement ?


    @+

  14. #14
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    C'est bon j'ai trouvé mon erreur, cela venait d'un problème dans mon affichage du fond d'ecran ... j'ecrasais l'intérieur de mon dc avec le fond ...

    bref encore une fois vous pouvez dire :

    Merci à farscape et stephdim pour leur conseil !

  15. #15
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    je ne comprends pas trop ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (this->m_dcPlot.GetSafeHdc() == NULL)
        {
            this->m_dcPlot.CreateCompatibleDC(&dc);
            this->m_bitmapPlot.CreateCompatibleBitmap(&dc, this->m_nClientWidth, this->m_nClientHeight);
            this->m_bitmapOldPlot = this->m_dcPlot.SelectObject(&m_bitmapPlot);
    
        }
    tu génères en mémoire d'après un dc local à la fonction.
    cela fonctionne la première fois mais après ? quand m_dcPlot est RAZ ?

  16. #16
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    m_dcPlot est une donnée membre de mon controle CGraph.
    Je l'initialise une seul fois, ensuite je ne fais que le modifier.

    L'initialisation c'est vrai que j'aurais pu la faire dans le constructeur ... ça aurait été peut etre un peu plus judicieux.

  17. #17
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    ce n'est pas ça qui me gène..
    c'est le fait que ce dc en mémoire soit construit à partir d'un dc dans la pile dont libéré quand tu sors de la fonction.
    d'où mon interrogation précédente.

  18. #18
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    Le dc dans la pile c'est celui là ? Il faudrait donc que je le passe en donnée membre ? pourquoi ?

  19. #19
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    ce n'est pas ça qui me gène...
    mais le fait que tu ne reconstruise pas ton DC en mémoire à chaque appel de cette fonction...
    a mon sens pour éviter les problèmes je l'aurais déclaré local comme le dc de base et j'aurais passé une référence sur ce dc en mémoire a toutes les fonctions appelées.

  20. #20
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    Autrement dit faire quelques choses comme ça dans la fonction Draw:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	CClientDC dc(this);
    	CDC dcPlot;
    	dcPlot.CreateCompatibleDC(&dc);
    	this->m_bitmapPlot.CreateCompatibleBitmap(&dc, this->m_nClientWidth, this->m_nClientHeight);
    	this->m_bitmapOldPlot = dcPlot.SelectObject(&m_bitmapPlot);
     
    	//Mon affichage personnalisé
     
    	dcPlot.SelectObject(this->m_bitmapOldPlot);
    Par contre je ne vois pas comment passer la référence de mon dcPlot dans chaque fonction comme DrawLine ?

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

Discussions similaires

  1. [AC-2010] Création d'une graphique (courbe)
    Par nadgreg dans le forum Access
    Réponses: 4
    Dernier message: 20/12/2013, 14h34
  2. Erreur création dynamique de contrôle
    Par thierrybatlle dans le forum Access
    Réponses: 1
    Dernier message: 10/02/2006, 11h00
  3. Contrôle graphique 3D
    Par Pierren dans le forum Access
    Réponses: 1
    Dernier message: 08/02/2006, 15h23
  4. [MFC] Création manuelle de contrôle bouton
    Par yanisliadon dans le forum MFC
    Réponses: 9
    Dernier message: 21/07/2005, 22h30
  5. Création dynamique de contrôles
    Par qi130 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 17/12/2004, 13h19

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