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 : 43
    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 : 43
    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 538
    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 538
    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