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 :

[MFC] Animation dans une vue


Sujet :

MFC

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm� Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par d�faut [MFC] Animation dans une vue
    Bonjour,

    voici sch�matiquement ce que je veux r�aliser :

    j'ai mon appli avec ma vue CMaVue, qui contient une variable BOOL fondFige, initialis�e depuis l'ext�rieur, et une surcharge de OnDraw :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CMaVue::OnDraw(CDC* dc) {
     
    if (!fondFige) { AffichageFondVue(dc);
                          SauvegardeVue(dc);
    } //if
    else { RestaurationVue(dc);
              AffichageSprite(dc);
    } //else
     
     
    } //OnDraw
    Je veux animer un genre de sprite (souvenirs, souvenirs, comme sur Amiga) grace � AffichageSprite(dc), mais comme AffichageFondVue(dc) est long et complexe, je ne veux pas tout redessiner � chaque vue:

    donc je mets fondFige � TRUE pour n'avoir qu'� plaquer le fond de la vue, pr�c�demment sauvegard�e par SauvegardeVue(dc) et r�affich�e par RestaurationVue(dc), et pour n'appeler ensuite que AffichageSprite.

    J'esp�re que je suis � peu pr�s clair ...

    Ma question est :
    que mettre dans SauvegardeVue(dc) et RestaurationVue(dc) ?

    merci d'avance de m'aider, le fonctionnement du CDC n'est pas clair pour moi ...
    Philippe

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Pour moi, tu dois cr�er un DC et un bitmap compatibles avec le DC pass� en param�tre (et le bitmap doit avoir la bonne taille), et recopier le tout avec BitBlt().

    Et �videmment, DC et Bitmap doivent �tre persistants...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirm� Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par d�faut
    Bonsoir,

    je vois en gros de quoi tu veux parler (fonctions CreateCompatibleDC et CreateCompatibleBitmap), mais de l� � les utiliser correctement ...

    je continue � chercher, mais une aide plus pr�cise m'aiderait beaucoup

    merci d'avance
    Philippe

  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
    Par d�faut
    salut,
    tu as un exemple d'utilisation dans la faq:
    http://c.developpez.com/faq/vc/?page...TreeCtrlCustom
    ici on laisse le controle se dessiner dans un bitmap en memoire .
    puis on modifie le dessin et enfin on projette sur l'�cran le bitmap (bitblt).


  5. #5
    Membre confirm� Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par d�faut
    Salut,

    alors, j'ai �tudi� ce code, et voil� ce que j'ai fait :

    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
     
     
    // variable globale de la vue (dans CMaVue.h)
    CDC memDC2;              // c'est le CDC de sauvegarde
    CRect rcClient;
     
    CMaVue::OnDraw(CDC* dc) {
    CDC memDC;
     
    // creation d'un DC en memoire .
    memDC.CreateCompatibleDC( dc );
    GetClientRect(&rcClient);
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap( dc, rcClient.Width(), rcClient.Height() );
     
     
    if (!fondFige) { AffichageFondVue(&memDC);
                          SauvegardeImageFond(&memDC);
                          RestaurerImageFond(dc);
    } //if
    else { RestaurationImageFond(dc);
              AffichageSpriteMobile(dc);
     
    } //else
     
    } //OnDraw
     
    //_____________________________________________________________________________
    void CMaVue::SauvegarderImageFond(CDC *memDC) {
     
    memcpy(&memDC2,memDC,sizeof(CDC) );
     
    } //proc
     
    //_____________________________________________________________________________
    void CMaVue::RestaurerImageFond(CDC *pDC) {
     
    pDC->BitBlt( rcClient.left, rcClient.top, rcClient.Width(), 
               rcClient.Height(), &memDC2, 0,0, SRCCOPY );
     
    } //proc
    1er cas: fondFige = FALSE;
    tout fonctionne : l'image de fond se dessine grace � AffichageFondVue dans le memDC, et s'affiche en une fois depuis le memDC2 (DC de sauvegarde) car SauvegarderImageFond a fait une copie de memDC dans memDC2 (donc le principe de sauvegarde du memDC fonctionne) ; mon sprite se d�place � l'�cran (pour m�moire, certes �a fonctionne, mais comme AffichageFondVue est complexe, je voulais ne r�afficher que le sprite sur un fond sauvegard�)

    2�me cas: fondFige = TRUE:
    j'ai l'image de fond (identique � la pr�c�dente) et mon sprite qui s'affiche EN LAISSANT DES TRACES (c'est ce que je veux pas !). Or, je devrais avoir l'image de fond et un seul sprite mobile, car j'ai restaur� le memDC2 (image de fond sauvegard�e, vierge en quelque sorte) sur laquelle j'ai affich� le sprite � sa nouvelle position.

    Moi y'en a rien comprendre du tout
    Qu'en penses tu ?

    Philippe

  6. #6
    mat.M
    Invit�(e)
    Par d�faut
    Citation Envoy� par Philippe320
    Moi y'en a rien comprendre du tout
    Qu'en penses tu ?

    Philippe
    Par analogie avec les surfaces de Direct Draw( composante de Direct X) il vaut mieux dessiner chaque �l�ments en "calques" s�par�s les calques �tant des HDC en m�moire..
    Plutot que de d�clarer un CDC memDC on fait une "pile" de CDC :

    CArray <CDC,CDC> m_tabCDC;
    Ou bien avec CObArray, COblist

    Dans le OnDraw il suffit de copier les "calques" les uns sur les autres.
    Regarde l'aide sur CArray dans le MSDN
    Sinon tu peux prendre aussi les conteneurs de la STL std::vector , std::list...

    Pour de meilleurs performances je sugg�rrais SDL bien que parfois avec le GDI c'est aussi rapide que SDL...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 6
    Dernier message: 14/12/2004, 02h47
  2. Ins�rer dans une Vue ordonn�e
    Par biroule dans le forum MS SQL Server
    R�ponses: 3
    Dernier message: 27/09/2004, 15h27
  3. [mfc] affichage dans une boite de dialog
    Par chronos dans le forum MFC
    R�ponses: 3
    Dernier message: 14/06/2004, 15h12
  4. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    R�ponses: 5
    Dernier message: 23/04/2004, 22h51
  5. [MFC] CPropertySheet dans une CFormView ???
    Par Lofwyr dans le forum MFC
    R�ponses: 2
    Dernier message: 30/07/2003, 16h49

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