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++

  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 ...

  7. #7
    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
    Oui, c'était bien ca !
    Depuis le début, je ne faisais pas attention au fait que la fonction void CVMR9Graph::SetPos(LONGLONG position) de directshow prenait un LONGLONG en argument, et moi je lui passais un int!

    Il a donc juste fallu que je change le void CMainFrame::SetCurrentFilePos(int n) en
    void CMainFrame::SetCurrentFilePos(LONGLONG n), ce qui a résolu tout mes problèmes!!

    c'est !

+ 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