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 :

Récuperer un Document


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Par défaut Récuperer un Document
    Bonjour,

    Debutant en C++, je realise un jeu de Poker avec les MFC.
    Je galere un peu avec les MFC, en effet je travaille sur un Document PokerGameDoc qui cree un jeu de Poker (class jeu)
    J'ai donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CPokerGameDoc::CPokerGameDoc()
    {
    	// TODO : ajoutez ici le code d'une construction unique
    	jeuPoker = Jeu();
    	jeuPoker.initialiseJoueur();	
    }
    Au cours du jeu, je suis amene a utiliser des fonctions de la class Jeu.

    J'aimerai pouvoir acceder au document CPokerGameDoc depuis la class Jeu.

    Malheuresement la commande ci dessous ne marche pas:
    CPokerGameDoc *pDoc = (CPokerGameDoc*)GetDocument();

    La class Jeu n'est ni un CDocument ni un CView.

    La raison pour laquelle je desire faire cela est de pouvoir faire:
    pDoc->UpdateAllViews(this);
    mais aussi de pouvoir activer des boutons d'une autre classe de type CFormView.

    J'espere avoir ete clair et je vous remercie par avance de tout ce que vous pourrez me conseiller..

  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
    Par défaut
    salut,
    tu peux en dire plus sur ta classe de jeu .
    je ne vois pas la raison de faire un updateallview pour rafraichir, si la classe de vue ne fait pas partie de l'architecture document/view ...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Par défaut
    Oui bien sur.

    La class Jeu cree mes joueurs, mes cartes et permet le deroulement d'une partie.
    Par exemple elle contient la fonction:
    fairePremierTourMise()
    Cette fonction permet a chaque joueur (hors utilisateur) de miser de l'argent (small blind, big blind etc...).
    Quand c'est au tour de l'utilisateur de jouer une CFormView permet a l'utilisateur de jouer (call,raise,fold). La CFormView recupere le Document et relance une fonction de la classe Jeu pour continuer le jeu. (faireTourMise).

    Ce que je voudrais faire par exemple, c'est pouvoir afficher une fleche rouge sur le joueur qui est entrain de jouer. Pour cela chaque joueur a une position et la fonction OnDraw de CPokerGameView tracerai cette fleche rouge.

    J'aurai donc besoin de faire un refresh depuis ma fonction FaireTourMise de la class Jeu.

    Je sais pas si c'est clair? Desole debutant...

    PS: dsl pr les accents, clavier qwerty

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    En toute logique, la modification de l'état de jeuPoker sera consécutive à soit une action IHM, soit un évènement type Time, soit à une 'boucle'. Dans les 2 premiers cas, il est évident que cela transite d'abord par une des classes du framework (Document/Frame ou View). C'est certainement à niveau qu'il faut solliciter l'UpdateAllViews. Dans le troisième cas, ça peut se discuter.
    A priori, je dirais que jeuPoker devrait être indépendant du framework que tu utilises (pour pouvoir porter ton 'moteur' de jeu sur une autre plateforme). Donc, il devrait être 'piloté' par Document ou au pire par la frame.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Par défaut
    J'ai pas tout compris (notamment IHM?).
    En effet je transite par la CFormView,

    - CPokerGameDoc instancie un jeu
    Jeu jeuPoker

    - PartieGauche (CFormView) attend que l'utilisateur clique sur "nvelle partie"
    l'evenement declencher est alors:
    pDoc->jeuPoker.fairePremierTourMise()
    ou pDoc est issue de GetDocument() sur CPokerGameDoc.

    -cette fonction fait jouer les 3 premiers joueurs de l'ordinateur

    -une fois cette fonction finit (on revient dans l'evenemt du bouton nvelle partie), je met a jour ma view.
    Apparait donc ttes les actions que les joueurs ont fait (leur tapis est modifie, leur etat aussi) Si jamais un joueur s'est couche alors il a disparu...
    Mais cette mise a jour ne se fait qu'apres que tout le monde ait joue! i.e elle ne se fait pas au moment meme ou le joueur joue (ce qui m'empeche notamment de dessiner une fleche rouge sur celui qui joue entre autre)...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Par défaut
    Desole je vous a pas remercie,

    merci de vos reponses!

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    IHM: Interface Homme Machine. Ca englobe beaucoup de chose mais dans 80% des cas on désigne ainsi les fenêtres, boutons, menu etc.. qui permettent à l'utilisateur d'agir sur ton application.

    L'idée est que jeuPoker notifie de l'avancement à Document à différentes étapes de fairePremierTourMise (puis des autres méthodes, j'imagine).
    Deux solutions:
    1/ Découper les différentes actions de fairePremierTourMise en unités atomiques appelées par ton document. Entre chaque appel, le document sollicite la mise à jour de l'interface.
    2/Fournir à jeuPoker une interface de notification : c'est lui qui sollicite la mise à jour régulièrement.

    Pour la seconde solution, tu as plusieurs possibilités:
    1/ Association jeuPoker<->CDocument: Tu rajoutes à jeuPoker un pointeur vers le document qui le contient. Le document fourni la fonction qui va bien.
    2/ Du même genre que 1/, mais au lieu d'utiliser CDocument, tu utilises une classe qui sert uniquement à gérer cette interface (et qui fait le pont entre ton document et ton jeuPoker)
    3/ Tu utilises des bibliothèques existantes de type signaux/slot (expl Boost.Signal)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Par défaut
    Merci encore!

    Je suis d'accord avec la premiere solution.

    Cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CPokerGameDoc::CPokerGameDoc()
    {
    	// TODO : ajoutez ici le code d'une construction unique
    	time_t ltime;
    	time(&ltime);
    	srand(ltime);
    	rand();
    	jeuPoker = Jeu();
    	jeuPoker.pDoc = (CDocument*)this;
    	jeuPoker.initialiseJoueur();	
    }
    et a chaque fois, j'appelle la fonction:

    ((CPokerGameDoc*)pDoc)->UpdateAllViews(0);

    Le probleme maintenant est que ca ne fait rien!
    Si j'ai bien compris:
    UpdateAllView appelle la fonction OnUpdate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void CView::OnUpdate(CView* pSender, LPARAM /*lHint*/, CObject* /*pHint*/)
    {
    	ASSERT(pSender != this);
    	UNUSED(pSender);     // unused in release builds
     
    	// invalidate the entire pane, erase background too
    	Invalidate(TRUE);
    }
    J'ai essaye d'overload ma fonction en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void CPokerViewDoc::OnUpdate(CView* pSender, LPARAM /*lHint*/, CObject* /*pHint*/)
    {
    	ASSERT(pSender != NULL);
    	UNUSED(pSender);     // unused in release builds
    
    	// invalidate the entire pane, erase background too
    	Invalidate(TRUE);
    }
    Mais ca ne marche toujours pas...(dans ce cas la, ca plante) :-(

    Par contre j'ai pas tres bien compris ce que fait ASSERT ou ASSERT_VALID...

    Une idee pour resoudre le probleme?

    Encore merci

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par assoul Voir le message
    Par contre j'ai pas tres bien compris ce que fait ASSERT ou ASSERT_VALID...
    Ce sont des macros pour vérifier une expression à l'exécution en mode débug :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ASSERT(pSender != NULL);
    Si pSender vaut NULL, alors ça sort (de mémoire) une exception. Ca te permet de te positionner sur ton code en mode debug pour vérifier ce qui ne va pas.
    En release, ces macros ne font rien.

    En général, Invalidate marque la zone comme 'à redessiner' mais ne provoque pas l'envoi d'un message de redessin. Il faut l'adjoindre de UpdateWindow :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void CPokerViewDoc::OnUpdate(CView* pSender, LPARAM /*lHint*/, CObject* /*pHint*/)
    {
    	ASSERT(pSender != this);
    	UNUSED(pSender);     // unused in release builds
    
    	// invalidate the entire pane, erase background too
    	Invalidate(TRUE);
            UpdateWindow ();
    }

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Par défaut
    Ca marche!

    merci beaucoup!

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

Discussions similaires

  1. Récuperation du document d'alfresco
    Par franco9 dans le forum Alfresco
    Réponses: 0
    Dernier message: 14/11/2013, 16h01
  2. [WD-2007] récuperer un document word non-enregistré
    Par Bassel dans le forum Word
    Réponses: 4
    Dernier message: 08/07/2011, 18h00
  3. Réponses: 2
    Dernier message: 26/04/2009, 00h56
  4. Réponses: 6
    Dernier message: 31/07/2008, 21h18
  5. Récuperer un xml d'un Document
    Par Sylario dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 21/04/2006, 10h33

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