Erreur

Onepenar Messages postés 3 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 2 janvier 2009 - 2 janv. 2009 à 18:43
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 - 3 janv. 2009 à 00:16
Bonjour,
je suis en train de faire une application  visual c++de type document/view qui permet de peindre différentes formes sur l'écran. J'ai donc du utiliser la technique de double buffering afin d'éviter les scintillements. J'arrive donc bien a peindre sans scintillements, mais mon programme s'arrête systématiquement au bout de quelque temps avec une runtime error. Dans le debug je vois alors qu'il y a un probleme avec le m_hDC qui semble ne plus être reconnu au bout d'un moment:

m_hDC unused = CXX0030: Erreur : impossible d'évaluer l'expression

Pour le double buffering, j'ai tout d'abord utlilisé le code fourni à cette adresse :http://www.codeproject.com/KB/GDI/flickerfree.aspx
J'ai ensuite éssayé de l'implémenter directement dans ma méthode OnDraw() mais rien n'y fait.Je ne comprend pas pourquoi ca marche pendant un moment puis s'arrête brutalement.Problème de mémoire?
Quelqu'un aurait-il une idée pour me débloquer?

3 réponses

ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
2 janv. 2009 à 19:12
Bonsoir,

Il doit s'agir d'un problème de libération de ressource. Vérifie que pour chaque objet GDI créé, il y a bien un DeleteObject en fin de traitement, et bien sûr un DeleteDC ou EndPaint selon la méthode que tu utilises pour créer ton HDC.

ed73
0
Onepenar Messages postés 3 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 2 janvier 2009
2 janv. 2009 à 19:54
Merci de répondre aussi vite. J'avais bien oublié de mettre des DeleteObject après chaque utilisation. Maintenant  ca me donne une autre erreur:

 Exception non gérée à 0x78aa607c (mfc90ud.dll) dans _IHM_.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000004.

apparement il trouve un  m_hObject null a cet endroit:

void CLine::Draw(CDC *pDC) {
    CPen aPen, *pPen;
    aPen.CreatePen(PS_SOLID, m_PenWidth,m_color); //Creer une plume
    pPen = pDC -> SelectObject(&aPen); //Selection de la plume en gardant l'ancienne dans pPen
    pDC->MoveTo(m_startPoint);
    pDC->LineTo(m_endPoint);
    pDC -> SelectObject(pPen); //Restaurer l'ancienne plume
    aPen.DeleteObject();
    pPen->DeleteObject();
   
}

J'ai essayé aussi de ne supprimer que aPen  mais ca me refait l'erreur précédente avec le m_hDC...
Merci de ton aide.
0
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
3 janv. 2009 à 00:16
Non, il ne faut surtout pas écrire pPen->DeleteObject(), et ce pour 2 raisons.

1) pPen est séléctionné dans pDC
2) Je suppose que c'est le HPEN par défaut et il ne faut pas le détruire.

aPen.DeleteObject n'est pas nécessaire non plus car le destructeur de CPen invoque la méthode DeleteObject().

Ton erreur vient probablement d'une mauvaise gestion des HDC ailleurs dans ton code.
0
Rejoignez-nous