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 :

CProgressCtrl ne marche pas


Sujet :

MFC

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut CProgressCtrl ne marche pas
    Bonjour, je veux faire un CProgressCtrl du genre dans l'image jointe: voici mon code!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void CSplashScreenEx::AddProgressBar()
    {
    	CProgressCtrl* m_pProgressCtrl = new CProgressCtrl() ;
    	CRect rect(110,240,350,260) ; 
    	CWnd *pwnd = GetWnd() ;
    	m_pProgressCtrl->Create(WS_CHILD|WS_VISIBLE|PBS_MARQUEE, rect, pwnd, 1) ;
    	m_pProgressCtrl->SendMessage(PBM_SETMARQUEE,0,900) ;
     
     
     
    }
    Probleme j'ai le ProgressBar mais y a pas l'animation!!Alors que j'ai bien envoyé le message!!

    Help me please, je suis debutant!
    merci d'avance
    Images attachées Images attachées  

  2. #2
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    Si tu utilises une progress bar, c'est que tu fais un travail qui est long.

    Ce travail qui est long, il est dans un thread à part ou bien dans une boucle de traitement de message de Windows. Si tu ne rends pas la main à Windows dans ta boucle de message, c'est peut être la raison du manque d'animation.

    Un bout de code s'il te plait ? Parce que là, on ne voit que la création du progress bar.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut
    Oui, c'est un travail qui est long, en fait il s'agit de l'ouverture d'un document qui es volumineux et de ce fait cela prends enormement de temps.
    Ce travail long ce fait effectivement dans une boucle de traitement de message de windows.
    Etant debutant en MFC je sais pas trop comment ça marche,
    là je crée bien mon progress bar que je fait apparaitre dans un splash, et mon idée était de faire l'animation jusqu'à ce que le splah disparait car le splash sera fermé desque l'ouverture du document est effective.
    A mon avis quand je crée ce progress bar:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void CSplashScreenEx::AddProgressBar()
    {
    	CProgressCtrl* m_pProgressCtrl = new CProgressCtrl() ;
    	CRect rect(110,240,350,260) ; 
    	CWnd *pwnd = GetWnd() ;
    	m_pProgressCtrl->Create(WS_CHILD|WS_VISIBLE|PBS_MARQUEE, rect, pwnd, 1) ;
    et que je lance ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pProgressCtrl->SendMessage(PBM_SETMARQUEE,0,900) ;
    je devais avoir l'animation!!!

    Dites moi coment je dois rendre la main à windows?je comprends pas trop, svp!!

    merci d'avance!



    }

  4. #4
    Membre très actif
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    374
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 374
    Par défaut solution..
    bon, j'ai rencontré le même gros probléme, pour le traitement de grosses facturations.
    alors, j'ai trouvé une solution peut-etre pas académique, mais qui a le mérite de fonctionner.
    si quelqu'un trouve à redire, please, merci d'indiquer comment faire mieux et plus académique.

    donc, mon contexte est d'abord du MDI, Multiple Document Interface.
    donc, une mainform qui recoit en entrée tous les messages et les dispatch vers les fenetres filles.
    dans ces messages, on trouve aussi tous les ordres de dessin.
    il peut arriver, (pourquoi, je sais pas exactement) qu'il y ait un blocage, que la pompe chargée de transmettre ces messages, ait un hocquet, tant que la fenetre fille a la main..
    donc, dans mainfrm.cpp, j'ai rajouté la fonction suivante, dont la fonction est de suppléer à l'interruption "programmée.." du fonctionnement normal de la pompe à messages.

    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
    void CMainFrame::PumpMessages()
    {
    	// Handle dialog messages 
        MSG msg; 
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
        { 
            if (!AfxGetApp()->PreTranslateMessage(&msg)) 
          { 
             ::TranslateMessage(&msg); 
             ::DispatchMessage(&msg); 
         }            
         AfxGetApp()->OnIdle(0);   // updates user interface 
        AfxGetApp()->OnIdle(1);   // frees temporary objects 
        } 
     
    }
    ne pas oublier le handler dans le mainfrm.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public:
    void PumpMessages();   // assure le dispatch des messages windows mise a jour affichage pendant les opérations longues
    pour l'utiliser, il faut pouvoir appeller la fonction de l'objet depuis un autre objet,
    pour ca, j'avais trouvé le truc de definir en global un pointeur
    dans le stdafx.h, je rajoute le lien , comme ca toutes les classes peuvent l'utiliser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <mainfrm.h"
    extern CMainFrame *mainform;
    puis ne pas oublier d'initialiser ce pointeur, à la creation de la mainform.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CMainFrame::CMainFrame()
    {
      mainform=this;	
    // initialisation diverses, etc...
    }
    et voila, c'est prêt.

    aucun mérite, j'ai pas tout inventé.

    comment ca marche:
    dans ta boucle d'alimentation qui traite tes opérations et mets à jour l'indice de ton progressbar, tu a juste à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mainform->PumpMessages();
    et ca va assurer le passage des message de dessin et de mise à jour de l'ensemble.

    maintenant, au cas ou tu ais oublié, il ne faut pas oublier de faire evoluer le parametre de la CProgressBar

    donc à l'initialisation,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    m_pProgressCtrl->SetRange(0,100);
    m_pProgressCtrl->SetPos(0);
    m_pProgressCtrl->ShowWindow(SW_SHOW);
    m_pProgressCtrl->UpdateData(FALSE);
    et dans la boucle de chargement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_pProgressCtrl->SetPos((int)progression);
    m_pProgressCtrl->UpdateData(FALSE);

Discussions similaires

  1. 'SHOW TABLES' marche pas sous postgresql !?
    Par fet dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 13/05/2004, 09h28
  2. Maximiser fenêtre ne marche pas
    Par sandrinec dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/06/2003, 12h02
  3. Réponses: 9
    Dernier message: 07/05/2003, 12h57
  4. [GifDecoder] marche pas dans applet avec IE
    Par formentor dans le forum Applets
    Réponses: 2
    Dernier message: 06/05/2003, 10h43
  5. Sysdate qui marche pas ??
    Par StouffR dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/08/2002, 13h23

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