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 :

Scroller par le code ClistCtrl


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut Scroller par le code ClistCtrl
    Bonjour à tous,

    J'ai 2 CListCtrl qui contiennent le même nombre de ligne. J'aimerais que la scrollbar du 1er CListCtrl fasse descendre à la fois ses item mais aussi les items du 2eme CListCtrl (et qu'il n'y ai pas de scrollbar pour le 2eme ClistCtrl).

    Pour le moment j'arrive à faire bouger la scrollbar de gauche et de droite en même temps en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void CFenetreDlg::OnLvnBeginScrollTab1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMLVSCROLL pStateChanged = reinterpret_cast<LPNMLVSCROLL>(pNMHDR);
    	*pResult = 0;
     
    	Tab2.SetScrollPos (SB_VERT,Tab1.GetScrollPos(SB_VERT));
    }
    Mais ça ne me convient pas car les items de la 2eme CListCtrl ne bougent pas et j'aimerais avoir juste une scrollbar.

    Donc j'ai vue que l'on pouvait faire ça avec une ClistBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_ListData.SetTopIndex(newIndex);
    Mais je ne connais pas l'équivalent en CListCtrl. Avez vous une idée de comment réaliser ce double défilement?

  2. #2
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Pour faire ça tu dois a mon avis gérer toi-même un contrôle de type CScrollBar.
    Ça te permettra de faire exactement ce que tu veux contrairement aux scrollbars intégrées directement dans d'autres contrôles, comme dans le cas de ta ClistCtrl.
    Après, pour commencer, il faudra que tu regardes du côté de OnHScroll et OnVScroll (selon le cas) ...

    Bon courage.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    Je veux bien utiliser des Scroll perso mais je ne sais pas comment les relier pour faire bouger l'affichage de mon CListctrl. J'ai beau chercher partout je n'arrive qu'à bouger ma scrollbar mais ça n'a aucun effet sur ma liste.

    Il doit bien y avoir une solution pour faire bouger 2 CListctrl en même temps

  4. #4
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Citation Envoyé par TheGzD Voir le message
    il faudra que tu regardes du côté de OnHScroll et OnVScroll (selon le cas)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    Je suis allé voir j'ai fais

    mais une fois que j'ai détecté que j'étais entrain de scroller il faut bien que ça ai une action sur ma liste.

    Je suis arrivé à faire scroller à l'horizontale ma 2eme liste à partir de la scrollbar de la 1ere grace à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tab2.Scroll (Tab1.GetScrollPos(SB_VERT));
    Mais j'arrive pas à le faire à la verticale

  6. #6
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Montre tout ton code que je vois exactement ce que tu as fait.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void CFenetreDlg::OnLvnBeginScrollTab(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	// Cette fonctionnalité requiert Internet Explorer version*5.5 ou ultérieure.
    	// Le symbole _WIN32_IE doit être >= 0x0560.
    	LPNMLVSCROLL pStateChanged = reinterpret_cast<LPNMLVSCROLL>(pNMHDR);
    	// TODO: ajoutez ici le code de votre gestionnaire de notification de contrôle
    	*pResult = 0;
     
    	Tab2.Scroll (Tab1.GetScrollPos(SB_VERT)); // bouge à l'horizontale
    	//Tab2.SetScrollPos (SB_VERT, Tab1.GetScrollPos(SB_VERT), true); bouge uniquement le scroll
    }

  8. #8
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Tu ne m'as pas posté tout ton code ...
    Après le peu que je vois c'est pas franchement réjouissant : tu n'utilises même pas pStateChanged qui te donne pourtant toutes les infos dont tu devrais avoir besoin dans ton cas d'utilisation.

    Commence par implémenter ce dont je t'ai parlé et ça sera, non seulement plus propre, mais ça aura le mérite de marcher.
    Sinon si tu t'entêtes à vouloir utiliser les scrollbars "internes" à tes CListCtrl, tu vas devoir être obligé de te faire une CListCrtPerso (surcharge de CListCtrl) sans garanti que ça marche. En effet au niveau du parent tu n'auras qu'un accès limité aux composants "internes" d'un contrôle, ce qui actuellement te pose quelques problèmes il semblerait.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    Désolé je suis un peu tétu et je connais pas bien les limites des MFC... (ni même les MFC )

    Donc maintenant j'ai bien compris je ne pourrais pas le faire avec les scrolls intégré

    Donc j'en reviens à faire ma propre scroll et je retombe sur le problème que j'ai eu tout à l'heure (j'ai l'impression de tourner en rond). Je crée ma scrollbar et je n'ai pas d'évènement donc je me dis il faut que je que l'écrive. J'ai donc fait dans mon .cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    afx_msg void OnVScroll (SB_BOTTOM, SB_THUMBPOSITION, NULL);
    et dans mon .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    afx_msg void OnVScroll(
       UINT nSBCode,
       UINT nPos,
       CScrollBar* pScrollBar 
    );
    mais ça marche pas.

    J'ai aussi rajouté une variable CScrollBar à ma scrollbar

  10. #10
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Attention quand tu crées la scrollbar par l'éditeur de ressource, il y a en 2 types : un vertical, l'autre horizontal.

    Ton problème pourrait bien venir de là.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    J'ai créé une verticale et j'utilise OnVScroll.

    En fait je ne sais pas utiliser les scrollsbar donc je vais essayer de me documenter mais c'est pas simple j'ai l'impression. Je ne trouve pas grand chose en tuto pour les scrolls bars.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    Salut,

    Bon j'avance doucement mais surement.

    Je suis arrivé à implémenter le en passant par les messages de l'assistant de classe de ma scrollbar verticale.

    De là j'ai adapté le code venant de MSDN pour une scrollbar horizontale à une verticale. ça donne le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //Implémentation
    public :
    	    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    ...

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    void CFenetreDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
       int minpos;
       int maxpos;
       GetScrollRange(SB_VERT, &minpos, &maxpos); 
       maxpos = GetScrollLimit(SB_VERT);
     
       // Get the current position of scroll box.
       int curpos = GetScrollPos(SB_VERT);
     
       // Determine the new position of scroll box.
       switch (nSBCode)
       {
       case SB_TOP:      // Scroll to far top.
          curpos = minpos;
          break;
     
       case SB_BOTTOM:      // Scroll to far bottom.
          curpos = maxpos;
          break;
     
       case SB_ENDSCROLL:   // End scroll.
          break;
     
       case SB_LINEUP:      // Scroll up.
          if (curpos > minpos)
             curpos--;
          break;
     
       case SB_LINEDOWN:   // Scroll down.
          if (curpos < maxpos)
             curpos++;
          break;
     
       case SB_PAGEUP:    // Scroll one page ip.
       {
          // Get the page size. 
          SCROLLINFO   info;
          GetScrollInfo(SB_VERT, &info, SIF_ALL);
     
          if (curpos > minpos)
          curpos = max(minpos, curpos - (int) info.nPage);
       }
          break;
     
       case SB_PAGEDOWN:      // Scroll one page down.
       {
          // Get the page size. 
          SCROLLINFO   info;
          GetScrollInfo(SB_VERT, &info, SIF_ALL);
     
          if (curpos < maxpos)
             curpos = min(maxpos, curpos + (int) info.nPage);
       }
          break;
     
       case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position
          curpos = nPos;      // of the scroll box at the end of the drag operation.
          break;
     
       case SB_THUMBTRACK:   // Drag scroll box to specified position. nPos is the
          curpos = nPos;     // position that the scroll box has been dragged to.
          break;
       }
     
       // Set the new position of the thumb (scroll box).
       SetScrollPos(SB_VERT, curpos);
       CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
    }
    Mais voilà le problème c'est que ma Scrollbar revient toujours à 0 quelque soit le mouvement que je réalise.

    J'ai essayé en initialisant minposà 0 et maxpos à 100 mais toujours le même résultat...

  13. #13
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Mais voilà le problème c'est que ma Scrollbar revient toujours à 0 quelque soit le mouvement que je réalise
    désolé mais je ne comprends pas ce que tu veux dire. Dans quel cas d'utilisation ? Arrives-tu à scroller dans CListCtrl ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    Non je n'y arrive pas. En fait j'ai du mal à comprendre le fonctionnement des scollsbar.

    Actuellement j'ai une scrollbar qui ne peut pas bouger (quand j'essais de la déplacer elle revient toujours en position initiale) et je dans l'hypothèse ou j'arrive à la faire bouger je ne sais pas comment la relier à mon CListctrl pour scroller l'affichage.

  15. #15
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    J'ai regardé un peu ton code et y a des problèmes


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GetScrollRange(SB_VERT, &minpos, &maxpos);
    maxpos = GetScrollLimit(SB_VERT);      // Get the current position of scroll box.
    int curpos = GetScrollPos(SB_VERT);
    tu ne manipules pas un CSrollBar mais les scrollbars "internes" de ta fenêtre parent ! Y a d'autres appels à des fonctions du même type dans ton code ...

    Ce que tu dois faire (et que je t'ai déjà répété plusieurs fois ) c'est commencer par associer un contrôle à l'objet graphique de la scrollbar verticale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CScrollBar m_scrollbarV;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DDX_Control(pDX, IDC_SCROLLBARV, m_scrollbarV);
    Ensuite tu peux par exemple implémenter le code suivant pour le déplacement de l'ascenseur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case SB_THUMBTRACK :
                    curpos = nPos;
                    this->m_scrollbarV.SetScrollPos(curpos);
                    // scroller dans ta fenêtre après calcul du ratio curpos/maxpos
                    break;
    Tu vois ce que je veux dire maintenant ?

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    Oui je vois maintenant je n'avais pas défini de variable à ma scrollbar. Je vais tenter ça (petit soucis d'internet donc je suis pas très réactif ).

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    ça marche du tonner (bon sauf les pageup pagedown mais c'est pas génant) je te remercie voici le code :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    void CFenetreDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
       int minpos = 0;
       int maxpos = 100;
       ScrollPerso.SetScrollRange (minpos, maxpos, 1);
     
       // Get the current position of scroll box.
       int curpos = ScrollPerso.GetScrollPos ();
     
       // Determine the new position of scroll box.
       switch (nSBCode)
       {
       case SB_TOP:      // Scroll to far top.
          curpos = minpos;
          break;
     
       case SB_BOTTOM:      // Scroll to far bottom.
          curpos = maxpos;
          break;
     
       case SB_ENDSCROLL:   // End scroll.
          break;
     
       case SB_LINEUP:      // Scroll up.
          if (curpos > minpos)
             curpos--;
          break;
     
       case SB_LINEDOWN:   // Scroll down.
          if (curpos < maxpos)
             curpos++;
          break;
     
       case SB_PAGEUP:    // Scroll one page ip.
       {
          // Get the page size. 
          SCROLLINFO   info;
          ScrollPerso.GetScrollInfo (&info, SIF_ALL);
     
          if (curpos > minpos)
          curpos = max(minpos, curpos - (int) info.nPage);
       }
          break;
     
       case SB_PAGEDOWN:      // Scroll one page down.
       {
          // Get the page size. 
          SCROLLINFO   info;
          ScrollPerso.GetScrollInfo (&info, SIF_ALL);
     
          if (curpos < maxpos)
             curpos = min(maxpos, curpos + (int) info.nPage);
       }
          break;
     
       case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position
          curpos = nPos;      // of the scroll box at the end of the drag operation.
          break;
     
       case SB_THUMBTRACK:   // Drag scroll box to specified position. nPos is the
          curpos = nPos;     // position that the scroll box has been dragged to.
          break;
       }
     
       // Set the new position of the thumb (scroll box).
       this->ScrollPerso.SetScrollPos(curpos);
       CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
    }
    Par contre maintenant il me manque plus qu'une info et après je pourrais faire ma popote et ajuster la taille de la scrollbar. Cette info c'est comment scroller mon CListCtrl avec la position de ma scrollbar.

  18. #18
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    il me manque plus qu'une info et après je pourrais faire ma popote et ajuster la taille de la scrollbar
    regarde du côté de SetScrollInfo.
    En plus de te permettre de calculer dynamiquement la taille de ton ascenseur, ça t'aidera aussi déterminer le pas (= nombre de ligne soit vers le bas ou vers le haut) des pageup et pagedown.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    ça je vois bien comment ajuster ma scrollbar pour qu'elle corresponde avec le nombre d'éléments dans mon CListCtrl mais ce que je n'arrive pas à faire c'est faire varier les éléments affichés dans mon CListCtrl en fonction de la position de la ScrollBar qui marche tout bien maintenant

  20. #20
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Quelque chose comme EnsureVisible (jamais testé perso) ou tout simplement Scroll pourrait t'aider, non ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VB.NET] Selectionner un noeud du treeview par le code
    Par Elbarto dans le forum Windows Forms
    Réponses: 7
    Dernier message: 23/02/2006, 10h49
  2. Réponses: 9
    Dernier message: 20/09/2005, 17h18
  3. changer style ou class par le code
    Par genetechno dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/07/2005, 10h12
  4. [DBGRID] Comment derouler par le code une picklist ?
    Par kase74 dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/09/2004, 11h57

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