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 : Resize d'un MDIChild


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Par défaut MFC : Resize d'un MDIChild
    Bonjour,

    c'est ma première participation à ce Forum et j'avoue être épaté par la qualité du contenu proposé (tutoriels, cours, liens, critiques de livres, etc).

    Ma question concerne le développement sous MFC. Lorsque l'on crée une application "de base" MDI en MFC, le Resize de la fenêtre invoque systématiquement la méthode de rafraîchissement. Or ma routine de dessin est relativement lourde (ou mon code un peu pourri ? ;-) ), et j'aimerais que le redimensionnement se fasse "en fantôme" sans rafraichissement temps réel. J'ai cherché dans les attributs de fenêtre mais je n'ai rien trouvé dans ce sens. Quelqu'un aurait la solution ?

    Grand merci d'avance et bravo pour ce site / Forum !

  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,
    peut etre que tu as interet a utiliser un bitmap pour stocker ton dessin:
    lorsque tu dessines a la fin tu memorises le contenu dans un bitmap.
    les fois suivantes tu projettes uniquement le bitmap sur la surface de dessin.
    si le dessin doit etre modifié la destruction du bitmap est realisé avant le repaint .
    et tu retombes dans le cycle de depart.
    c'est un peu la technique du double buffer qui sera utiliser aussi dans windows vista .
    un truc comme ça à tester/modifier:
    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
     
            CRect rcClip, rcClient;
    	dc.GetClipBox( &rcClip );
    	GetClientRect(&rcClient);
     
    	CDC memDC;
    	memDC.CreateCompatibleDC( &dc );
     
    	if(!m_pBitmap)
    	{
    		m_pBitmap = new CBitmap;	
    		m_pBitmap->CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );
    		memDC.SelectObject( m_pbitmap );
    		// selectionne la region dans le dc en memoire
    		CRgn rgn;
    		rgn.CreateRectRgnIndirect( &rcClip );
    		memDC.SelectClipRgn(&rgn);
    		rgn.DeleteObject();
     
    		// dessin a realiser ici dans avec le dc memDC 
    		// votre dessin
    	}
    	else
    	{
    		memDC.SelectObject( m_pbitmap );
    		CRgn rgn;
    		rgn.CreateRectRgnIndirect( &rcClip );
    		memDC.SelectClipRgn(&rgn);
    		rgn.DeleteObject();
    	}	
    	dc.BitBlt( rcClip.left, rcClip.top, rcClip.Width(), 
               rcClip.Height(), &memDC, rcClip.left, rcClip.top, SRCCOPY );
    c'est une adaptation rapide de ce post de la faq:
    http://c.developpez.com/faq/vc/?page...TreeCtrlCustom

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Par défaut
    C'est un peu ce que je voulais éviter en réalité, pour des raisons de "simplicité" : c'est un mécanisme de "mise en cache" et c'est souvent sujet à bugs parce qu'on n'a pas pensé a rafraîchir le cache justement. Qui plus est ma View peut être modifiée par des actions de l'utilisateur, ce qui complique encore la sauce ... Toutefois avec un exemple sous les yeux ca semble réalisable, je vais au moins le tenter.
    Par curiosité, c'est impossible d'avoir un redimensionnement fantôme ? C'est ce que fait pourtant Adobe Illustrator (ici j'ai la CS1), j'imagine que ca fait donc partie des possibilités offertes par l'API Win32 donc par les MFC ... j'ai tort ?
    Merci pour la réponse en tout cas.

  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
    tu peux tenter de voir avec la fonction SetRedraw(FALSE); de la classe CWnd
    a mettre a false sur le OnSize.
    il faudra trouver l'endroit idoine pour le remettre a TRUE...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Par défaut
    J'ai "un peu tourné autour", j'obtiens diverses choses mais je doute d'arriver à une bonne solution puisqu'aucun message "fin de resize" n'existe en MFC du moins. J'ai peur qu'il faille se refaire une WinProc a la main si toute fois c'est possible ... Pourtant il me semble que le comportement "fantome" était le comportement de base sous Windows 95 non ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Par défaut Résolu ...
    Chose que je ne savais pas, certains messages ne sont pas gérés "de base" par les MFC (ce qui me choque assez ...). En Windows API, il existe bien un message "EnterSizeMove" et un "ExitSizeMove". IL faut donc compléter la map des messages des MFC pour l'objet considéré. Ca se fait de la facon suivante (mon objet est CGraphFrame) :

    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
     
    BEGIN_MESSAGE_MAP(CGraphFrame, CMDIChildWnd)
    		ON_MESSAGE( WM_ENTERSIZEMOVE, CGraphFrame::OnEnterSizeMove) 
    		ON_MESSAGE( WM_EXITSIZEMOVE, CGraphFrame::OnExitSizeMove)
    END_MESSAGE_MAP()
     
     
    puis dans la déclaration de la classe :
    class CGraphFrame : public CMDIChildWnd
    {
     public :
    	virtual LRESULT OnEnterSizeMove (WPARAM, LPARAM);
    	virtual LRESULT OnExitSizeMove (WPARAM, LPARAM);
     
    };
     
    puis pour l'implémentation :
    LRESULT 
    CGraphFrame::OnEnterSizeMove (WPARAM, LPARAM)
    {
    GetActiveView()->SetRedraw(FALSE);
    return (LRESULT)0;
    }
    LRESULT 
    CGraphFrame::OnExitSizeMove (WPARAM, LPARAM)
    {
    	GetActiveView()->SetRedraw(TRUE);
    	GetActiveView()->Invalidate();
    return (LRESULT)0;
    }
    ... Ouf !!!

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

Discussions similaires

  1. [MFC] Debutant, resize d'un cdialog
    Par Xhéras dans le forum MFC
    Réponses: 2
    Dernier message: 22/09/2006, 17h08
  2. [MFC]resize dynamique
    Par mickaelguilbert dans le forum MFC
    Réponses: 4
    Dernier message: 31/08/2005, 17h45
  3. [MFC] - MDI : CDialogBar resize....
    Par Alice9 dans le forum MFC
    Réponses: 5
    Dernier message: 18/02/2005, 17h12
  4. [MFC] COmment empecher le resize d'un SDI ?
    Par Soulsurfer dans le forum MFC
    Réponses: 12
    Dernier message: 28/06/2004, 17h28
  5. [MFC]Property Sheet resizable
    Par fr66 dans le forum MFC
    Réponses: 4
    Dernier message: 14/06/2004, 17h28

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