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 :

Probleme avec la fonction Ontimer


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Probleme avec la fonction Ontimer
    Bonjour,

    Je réalise actuellemnent un casse-briques sous visual c++ 6.0 et j'ai un problème concernant la fonction OnTimer().

    J'en suis au stade ou j'anime la balle dans la fenetre en la faisant rebondir sur les bord. Pour cela dans la fonction OnKeyDown:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(nChar==VK_SPACE)
            SetTimer(1,10,NULL);
    dans la fonction OnTimer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RedrawWindow(pDoc->p_part->p_bal->rect);
    C'est a dire je decide de redessiner uniquement la balle.

    Je possede une classe CPartie, et une classe Cballe.
    J'ai créé un pointeur CPartie (p_part) dans le Doc et un pointeur CBalle (p_bal) dans la classe CPartie. D'ou le pDoc->p_part->p_bal->rect2.

    Dans la classe CBalle j'ai créer un rect de la classe CRect que j'ai instancié dans le constructeur.J'ai également créé une fonction deplacement_balle() qui m'incrémente les points de la balle défini dans le rect.SetRect(...).

    Pour finir voila le code inscrit dans la fonction OnDraw(CDC* pDC) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CPen pen1(PS_NULL,5,RGB(0,221,255));
     pDC->SelectObject(&pen1);
     
      CBrush brush3 (6,COULEUR_BALLE);
      pDC->SelectObject(&brush3);
      pDoc->p_part->p_bal->deplacement_balle();
      pDC->Ellipse(pDoc->p_part->p_bal->rect2);
    Je passe les détails des condition pour le rebondissement mon problème ne venant pas de la.

    Bref, tout cela pour en venir a mon probleme :

    Lorsque je lance le jeux tout fonctionne à merveille, la balle se deplace, elle rebondit, oui... mais pendant environ une trentaine de seconde, car tout a coup sans aucune raison (apparente!!) un message d'erreur apparait :

    Je cite : L'instruction à "0x5f43dfb1" emploie l'adresse mémoire "0x00000004" la mémoire ne peut pas etre "read".

    Arggggggggggggggg!!!!

    Je ne vois vraiment pas d'ou peut venir le problème, je sais que le problème viens de la fonction OnTimer() mais je ne sais pas ce que j'ai mal fait. J'ai essayé de faire un KillTimer(o) puis une relance immédiate, même problème!!

    Pouvez vous m'aider s'il vous plait;

    J'ai aussi un autre petit probleme mais bien moins important que je posterait dans un autre message.

    Je vous remercie de l'attention que vous avez porté a mon message.

  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,
    tu as certainement un probleme de pointeur non iniatilisé ou corrompu.
    il faut que tu lances ton programme en debug trace .
    au moment de l'erreur tu remontes la pile des appels pour voir quelle est la partie de ton code qui cause le probleme.
    il suffit alors d'inspecter les differentes valeurs en presences..

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Salut farscape

    Tout d'abord merci de m'avoir répondu.
    J'ai essayé de débuger comme tu me l'a dis. Mais bon je ne suis pas un as en la matiere donc j'ai essayé de faire tout ce que j'ai pu.
    Et voila ce que j'ai trouvé.

    L'erreur semble venir d'ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CPen* CDC::SelectObject(CPen* pPen)
    {
     ---> ASSERT(m_hDC != NULL);
    	HGDIOBJ hOldObj = NULL;
     
    	if (m_hDC != m_hAttribDC)
    		hOldObj = ::SelectObject(m_hDC, pPen->GetSafeHandle());
    	if (m_hAttribDC != NULL)
    		hOldObj = ::SelectObject(m_hAttribDC, pPen->GetSafeHandle());
    	return (CPen*)CGdiObject::FromHandle(hOldObj);
    Voila, donc je ne vois pas trop que faire.
    Si tu pouvais m'aider sa serait super cool!!

    Je peux t'envoyer mon programme si tu as le temps de consacrer un peux de temps pour le débuger.

    Voila mon mail : julien_2804@hotmail.com

    Je te remercie

    Salut!

  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
    salut ,
    ce qui veut dire que le handle de ton DC est null .
    et donc que DC n'est pas valide.
    il faudrait voir les conditions d'appels de Ondraw .

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Voila le code de ma fonction OnDraw

    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
    void CCasse_BriquesView::OnDraw(CDC* pDC)
    {
    	CCasse_BriquesDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
     
    	//Aire de jeux
    	//CRect rect;
    	rect.SetRect(AIRES_X1,AIRES_Y1,AIRES_X2,AIRES_Y2);
    	CBrush brush (6,COULEUR_CADRE_JEUX);
    	pDC->SelectObject(&brush);
    	pDC->Rectangle(rect);
     
    	//Palette
    	           affichage_palette(pDoc->p_part->p_pal->pos_x1,pDoc->p_part->p_pal->pos_x2,COULEUR_PALETTE);
     
     
    	//Balle
     
    	CPen pen1(PS_NULL, 0, RGB(0,0,0));
    	pDC2->SelectObject(&pen1);
     
    	CBrush brush3 (6,COULEUR_BALLE);
    	pDC2->SelectObject(&brush3);
    	pDoc->p_part->p_bal->deplacement_balle();
    	pDC2->Ellipse(pDoc->p_part->p_bal->rect2);
     
     
     
     
    	//Briques
    	CPen pen(PS_SOLID,1,COULEUR_CADRE_JEUX);
    	pDC->SelectObject(&pen);
     
     
    	CBrush brush2 (6,pDoc->p_part->p_brique->color);
    	pDC->SelectObject(&brush2);
     
    	for(int j=0; j<=5 ; j++)
    	{
    		for(int i=0 ; i<=10 ; i++)
    			pDC->Rectangle(pDoc->p_part->p_brique->rect2[i][j]);
    	}
    }
    Le problème semble donc venir du CPen, mais lorque j'enleve completement les lignes de codes liées au CPen le mçme problème se produit encore.

    Le problème viens assurement de la balle puisque lorsque le jeux marche sans la balle , aucun message d'erreur ne se produit.

    Voila

  6. #6
    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
    re,
    il sort d'ou ce pDC2 ? ( a mon avis l'erreur viens de la ).
    d'apres ton code tu ne devrais utiliser que le pDC fournit par OnDraw ...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Incompréhensible!!!!

    -lorsque je remplace pDC2 par pDC, déja un bug graphique apparait puisque la balle déssinée n'est plus vraiment ronde.

    -Et... à mon grand regret , la même erreur se produit au bout d'un certain temps d'application.

    Je suis déséspéré

    Je ne vois vraiment pas d'ou peut venir l'erreur.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Génial, tu avais bien raison!!!
    Le probleme venait bien du pDC2

    En fait dans mon programme j'avais créé plusieur petites fonctions des genre de clone de la fonction Ondraw, j'avais pour cela instancié un pointeur CDC* pDC2 que j'appelais dans chaque petite fonction de dessinage (la palette, la balle...)

    J'ai donc supprimé toutes ces petite fonction pour totalement changer de méthode puisque je fais désormais un RedrawWindows(rect) pour chaque element a redessiner.

    Le seul "petit probleme" qui en resulte c'est qu'il y a beaucoup de scintillement autour de la balle durant son déplacement.
    Aurais tu une solution pour régler ce problème?

    En tout cas merci beaucoup pour ton aide, et félicitation pour tes cours et tutoriels qui me sont d'une tres grande utilité.

  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 ,

    tu pourrais utiliser un bitmap en memoire pour ta balle et le projeter dans le dc final .
    ça eviterait de la redessiner à chaque fois.

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

Discussions similaires

  1. Probleme avec la fonction IF ELSE
    Par guillaumeIOB dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 02/12/2005, 11h52
  2. Probleme avec la fonction rename()
    Par TheZenZen dans le forum C
    Réponses: 6
    Dernier message: 08/10/2005, 15h59
  3. [LG] Problème avec la Fonction ReadLn en fin de programme
    Par killermano dans le forum Langage
    Réponses: 6
    Dernier message: 23/07/2005, 15h16
  4. [LG]Probleme avec une fonction
    Par xavier1936 dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2005, 22h48

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