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