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 :

plantage a cause d un MoveTo


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 97
    Par défaut plantage a cause d un MoveTo
    Bonjour,

    Mon programme plante très souvent (pas tout le temps, cela a l air assez aleatoire) quand j essaie de traces des traits a l écran.

    Dans le OnPaint(), je créé mon CClientDC que je passe (par adresse) a ma fonction d affichage pour tracer mes traits.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CClientDC dc(this);
     
    HPEN crayonRouge = CreatePen(PS_SOLID,1,RGB(255,0,0));
     
     
    //Appel de la fonction d affichage
     
     
    HPEN crayonNull = NULL;
    dc.SelectObject(crayonNull);
    dc.ReleaseAttribDC();
    DeleteObject(crayonRouge);
    Ma fonction d'affichage ressemble a ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //Dans la fonction d affichage
     
    dc -> SelectObject(crayon);
     
    dc -> MoveTo(rect.left,rect.bottom);
     
    for(int i=0;i<borne;i++)
    {
        dc -> LineTo(rect.left + i,bas - (int) ( valeurs[i]*180/(3.14) ) );
    }
    Au debugger, les valeurs passées en parametre a la fonction MoveTo() sont corrects.

    (Desole ppour les balises de code, je les ajouterais, je vais chercher comment faire autre part sur ce forum !)

    Merci
    pense à mettre la balise de code avec le bouton #, Merci Farscape

  2. #2
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Quand tu parles de plantage, quelle erreur as-tu exactement ?
    Quand se produit-elle : au lancement ? plus tard ?
    Etats des pointeurs de ta fenêtre ainsi que des éléments qui la composent ? HWND ?
    As-tu pensé à récupérer les objets courants (tels que le CPen) et les restauré après utilisation du tien ?

    Tu vas devoir en dire plus, car comme tu peux le constater on manque un poil d'infos pour t'aider vraiment

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 97
    Par défaut
    Merci de vote reponse,

    L erreur n as pas lieu au demarrage de l application mais après. En fait, je cherche a tracer des traits tout au long de l application (plusieurs fois par secondes) et l erreur se produit au bout d un certain temps, sans raison apparente.

    Le message d erreur indique qu un probleme est survenu dans le fichier wingdi.cpp line 627 et la pile d appel me donne la ligne correspondant a mon MoveTo.

    Dans le gestionnaire des ressources Windows, le nombre d objets GDI est de l ordre de 30 et reste constant.

    Comme tu me l as fait remarqué, le problème peut venir de l objet CPaintDC lui meme. Lors du plantage, j inspecte les valeurs des champs de mon CClientDC :

    CDC -> CObject ->rien de special
    CDC -> m_hdc : unused, m_hAttribDC : unused
    m_hWnd : unused

    En effet, mon CClientDC n a pas l air tres en regles, il doit manquer quelques initialisations !

    Comment initialiser ces attributs ?

    Merci

  4. #4
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Pourrais-tu nous montrer ton code stp ?

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Citation Envoyé par on2101 Voir le message
    Comme tu me l as fait remarqué, le problème peut venir de l objet CPaintDC lui meme. Lors du plantage, j inspecte les valeurs des champs de mon CClientDC :
    Tu sembles très mal utiliser le tracé avec CPen
    Quand tu crées un CPen 1 il faut appeler CPen::Create puis SelectObject qui retourne un pointeur sur le CPen courant mettons CPen 0.
    Une fois que le CPen 1 n'est plus utilisé il faut le détruire et restituer le CPen d'origine
    Voilà un exemple du MSDN
    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
     
    void CMyView::OnDraw( CDC* pDC )
    {
        CPen penBlack;  // Construct it, then initialize
        if( newPen.CreatePen( PS_SOLID, 2, RGB(0,0,0) ) )
        {
            // Select it into the device context
            // Save the old pen at the same time
            CPen* pOldPen = pDC->SelectObject( &penBlack );
     
            // Draw with the pen
            pDC->MoveTo(...);
            pDC->LineTo(...);
     
            // Restore the old pen to the device context
            pDC->SelectObject( pOldPen );
        }
        else
        {
            // Alert the user that resources are low
        }
    }
    tu vois que dans cet exemple on crée un pOldPen.
    Il faut le restituer avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pDC->SelectObject( pOldPen );
    Or dans le code donné tu ne fais pas cela.

    PS apparement il y a une erreur dans mon ( vieux ) MSDN ; c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( penBlack .CreatePen( PS_SOLID, 2, RGB(0,0,0) ) )
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( newPen.CreatePen( PS_SOLID, 2, RGB(0,0,0) ) )

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 97
    Par défaut
    Depuis que je récupère l'ancien crayon pour le remettre ensuite, je n'ai eu aucun nouveau plantage.

    Merci, c'était très bête comme erreur

    J'attends un peu avant de mettre RESOLU car le problème apparaissait de manière aléatoire !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/04/2008, 02h25
  2. Plantage a cause : panel non visible
    Par AT dans le forum Débuter
    Réponses: 13
    Dernier message: 05/01/2008, 08h31
  3. [debutant] plantage a cause du cosntructoeur et destructeur
    Par Battosaiii dans le forum Débuter
    Réponses: 11
    Dernier message: 12/11/2005, 19h13
  4. plantage a cause de CString::Format
    Par e-teo dans le forum MFC
    Réponses: 2
    Dernier message: 18/10/2005, 18h02
  5. [Oracle 9.1] Plantage SQL+ à cause d'une requête
    Par ftrifiro dans le forum Oracle
    Réponses: 8
    Dernier message: 04/10/2005, 15h08

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