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

Visual C++ Discussion :

Slider ne r�pondant pas correctement


Sujet :

Visual C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    41
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 41
    Par d�faut Slider ne r�pondant pas correctement
    Bonjour,

    j'ai un petit souci sur l'impl�mentation d'un CSliderCtrl dans un lecteur multim�dia que je suis en train de d�velopper. En effet, je souhaite que ce slider se d�place automatiquement pendant la lecture d'un fichier pour indiquer o� en est la progression. Pour ce point l�, pas de probl�me, ma fonction OnTimer marche nickel :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //timer se déclenchant toutes les secs
    void CMainFrame::OnTimer(UINT nIDEvent){  
    	sliderCtrl = reinterpret_cast<CSliderCtrl *>(this->m_wndDlgBar.GetDlgItem(IDC_SLIDER1));
    	int length = m_fileDuration/10000000;//pr mettre en secondes
    	int pasduneunite = length/100;
    	sliderCtrl->SetRange(0,length);
    	LONGLONG current;
    	m_graph.GetPos(&current);
    	long cur = (long)current/10000000;
    	sliderCtrl->SetPos(cur);
    }
    La o� cela marche moins bien, c'est lorsque j'impl�mente la m�thode qui permet de changer la position de lecture en manipulant le slider:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    void CMainFrame::OnNMReleasedcaptureSlider1(NMHDR *pNMHDR, LRESULT *pResult) {
    	sliderCtrl = reinterpret_cast<CSliderCtrl *>(this->m_wndDlgBar.GetDlgItem(IDC_SLIDER1));
    	int length = m_fileDuration/10000000;//met en secondes
    	int tick = length/100;//déplacement d'une unité du slider vaut:
    	int n = sliderCtrl->GetPos();
    	m_graph.SetPos(n*tick*10000000);
     
    }
    Ce qui se passe, c'est que lorsque je bouge le slider, celui-ci se remet � la position de lecture avant que je l'aie boug�, ou sinon celui ci prend parfois une position incorrecte.

    Quelqu'un a t-il une id�e?

    Merci !

  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,
    dans le deuxieme cas il faut que tu mettes a jour les informations qui permettent le positionnement dans le traitement du timer...
    et desactiver le timer pendant le traitement du deuxieme cas par un flag booleen test� dans la fonction de r�ponse du timer.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    41
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 41
    Par d�faut
    salut,
    je suis pas s�r d'avoir bien compris...
    Il faudrait que dans la fonction OnNMReleasedcaptureSlider1 je fasse une sorte de PauseTimer (sachant que je n'ai trouv� que SetTimer et KillTimer) lorsque je rentre dans la fonction, puis que je relance le timer � la fin de la fonction?
    Pour le moment, j'ai juste test� un
    sliderCtrl->SetPos(sliderCtrl->GetPos()) dans la fonction , mais ca ne change toujours rien.

    Et
    dans le deuxieme cas il faut que tu mettes a jour les informations qui permettent le positionnement dans le traitement du timer
    dans la fonction OnTimer, je ne vois pas quel traitement suppl�mentaire appliquer au slider.

    Ne pourrais-tu pas me montrer plut�t en code ce que je dois changer stp ?

    Merci bcp !

  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
    commence par faire des fonctions propres:
    - une fonction initialisant le bornes du slider en fonction du fichier
    - Une calculant la position du slider en fonction de la position dans le fichier.
    - Une calculant la position du fichier d'apr�s la position du slider.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    void CMainFrame::SetInitSlider()// a lancer uniquement a la mise en place du timer pas a chaque fois....
    {
    sliderCtrl = reinterpret_cast<CSliderCtrl *>(this->m_wndDlgBar.GetDlgItem(IDC_SLIDER1));
    int length = m_fileDuration/10000000;//pr mettre en secondes
    int pasduneunite = length/100;
    sliderCtrl->SetRange(0,length);
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    void CMainFrame::SetPosSlider(LONGLONG current)
    {
    sliderCtrl = reinterpret_cast<CSliderCtrl *>(this->m_wndDlgBar.GetDlgItem(IDC_SLIDER1));
    
        long cur = (long)current/10000000;
        sliderCtrl->SetPos(cur);
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    void CMainFrame::SetCurrentFilePos(int n)
    {
        int length = m_fileDuration/10000000;//met en secondes
        int tick = length/100;//d�placement d'une unit� du slider vaut:    
        m_graph.SetPos(n*tick*10000000);
    }
    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
    //timer se d�clenchant toutes les secs
    void CMainFrame::OnTimer(UINT nIDEvent)
    {  
      if(m_bInAction) return;
      LONGLONG current;
       m_graph.GetPos(&current);
       SetPosSlider(current);
    }
    
    void CMainFrame::OnNMReleasedcaptureSlider1(NMHDR *pNMHDR, LRESULT *pResult)
    {    
       sliderCtrl = reinterpret_cast<CSliderCtrl *>(this->m_wndDlgBar.GetDlgItem(IDC_SLIDER1));
       m_bInAction=true;// initialis� a false dans le constructeur de la classe.
       SetCurrentFilePos(sliderCtrl->GetPos());
       m_bInAction=false;
    }
    voila je n'ai pas test� c'est simple ,c'est ton code reprit et �crit diff�remment.
    si le booleen ne suffit pas on peut envisager:
    de killer le timer et de le recr�er en sortant ou utiliser un objet de synchronisation comme un CMutex pour bloquer l'acc�s.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    41
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 41
    Par d�faut
    Salut,

    D'abord merci pour ton aide.
    J'ai essay� ton code, mais ca ne r�sout pas le probl�me.
    J'ai aussi essay� de kill le timer puis de le recr�er, sans succ�s non plus.
    Mais je pense avoir trouv� la source du probl�me, qui est cependant assez bizzare !
    En effet, le code initial que j'avais pos� au d�but du post, ainsi que le code que tu m'as donn�, fonctionnent parfaitement sur un fichier d'une dur�e inf�rieure � environ 3 min 34 secondes !
    Sur des fichiers plus gros, lorsque je d�place le slider pour le positionner qq part dans le fichier dans une position entre 0 et 3min34, ca marche, mais qd j'essaie ailleurs, le slider revient o� il �tait avant ou bouge bizarrement!

    Au d�but, j'ai pens� que c'�tait parce que le slider que j'avais fait �tait trop petit, et par cons�quent que je ne pouvais pas repr�senter chaque seconde du fichier par un d�placement visuel effectif du slider. J'ai essay� alors de l'agrandir, mais rien y fait.
    Pour r�sumer, le slider se d�place bien du d�but � la fin de la dur�e du fichier quelque soit sa taille, mais ne peut etre manipul� correctement que pour des fichiers de 3min34 max !

    J'ai aussi essay� de voir du c�t� de ce qui permet la lecture de mon fichier, cela vient peut etre de ca. J'utilise DirectShow et la fonction SetPos utilis�e permettant de r�gler la position de lecture ressemble � ca :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    void CVMR9Graph::SetPos(LONGLONG position)
    {
    	m_pMediaSeeking->SetPositions(&position,AM_SEEKING_AbsolutePositioning,NULL,AM_SEEKING_NoPositioning);
    }
    J'ai cr�e un bouton qui, lorsque je clique dessus, utilise void CMainFrame::SetCurrentFilePos(int n) pour changer la position de lecture.
    Or, si j'arrive � changer la position pour un fichier de - de 3min34, ca ne marche plus pour un gros fichier!

    Le probl�me a donc l'air de venir d'ici , mais je ne vois vraiment pas cmt c'est possible . m_pMediaSeeking->SetPositions est une fonction d�ja existante de DirectShow, et il me semble que je l'utilise correctement!

    En tout cas merci de ton aide farscape, je vais essayer de voir pour ce souci.

  6. #6
    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
    je n'ai pas tout v�rifi� ,mais regarde si tu n'as pas de d�passement de capacit� sur les entiers utilis�s ...

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

Discussions similaires

  1. [Menu] Menu ne se met pas correctement en place
    Par white-rabbit dans le forum Java ME
    R�ponses: 1
    Dernier message: 27/11/2007, 15h15
  2. Mon clonage n'est pas correct ?
    Par elitost dans le forum Langage
    R�ponses: 6
    Dernier message: 21/03/2006, 14h38
  3. variable ne s'affiche pas correctement
    Par Didier100 dans le forum EDI, CMS, Outils, Scripts et API
    R�ponses: 8
    Dernier message: 24/02/2006, 14h01
  4. R�ponses: 13
    Dernier message: 31/08/2005, 14h03
  5. [IB71] mon Blob ne marche pas correctement
    Par BoeufBrocoli dans le forum InterBase
    R�ponses: 2
    Dernier message: 17/09/2003, 14h03

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