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 :

Initialiser un scrollbar pour une liste


Sujet :

MFC

  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut Initialiser un scrollbar pour une liste
    Bonjour à tous,

    Je suis entrain de faire une genre de list view, avec des colonne et des lignes. De plus, j'ai besion qu'elle puisse faire défiller ces éléments. Cependant, j'ai quelques difficultés à comprendre comment initialiser les scrollbar.

    Jusqu'ici, il semble que la manière dont je l'ai initialisée soit correct puisque tout fonctionne bien. Mais je ne comprend pas pourquoi ! Voici le code que j'ai uitliser jusqu'ici :

    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
     
    // Taille de ma zone client (ma liste)
    CRect rectZoneVisible;
    GetClientRect( &rectZoneVisible );
     
    // Est-ce que la liste possède un élément ? 
    if ( m_iRowCount > 0 )
    {
       // Taille de la colonne 0, (hauteur nécessaire)
       CRect colRect;
       GetClientColumnRect( 0, &colRect );
     
       // Taille de la ligne 0 (hauteur nécessaire)
       CRect rowRect;
       GetClientRowRect( 0, &rowRect );
     
       // Déterminer si la scrollbar vertical sera visible
       if ( (m_iRowCount * rowRect.Height()) > rectZoneVisible.Height() - 
    colRect.Height() )
       {
           // Initialiser la scrollbar vertical
           SCROLLINFO si;
           si.cbSize = sizeof(SCROLLINFO);
           si.fMask = SIF_ALL;
           si.nPos = m_ScrollBarHiddenV.GetScrollPos();
           si.nMin = 0;
           si.nMax = m_iRowCount - 1;
           si.nPage = rectZoneVisible.Height() / rowRect.Height();
           si.nTrackPos = 0;
           m_ScrollBarHiddenV.SetScrollInfo( &si, TRUE );
           m_ScrollBarHiddenV.ShowScrollBar(TRUE);
           ...
        }
        else
        {
           m_ScrollBarHiddenV.ShowScrollBar(FALSE);
        }
    }
    Pourquoi
    et pas ?

    Deuxièmement, si nPage doit représenter le nombre d'élément visible par page alors pourquoi ne serait-il pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     nPage = (rectZoneVisible.Height() - colRect.Height()) / rowRect.Height();
    À mon avis, il faut soustraire la hauteur des colonne à la zone visible (liste) pour déterminer combien d'élément seront visible par page ?

    Si quelqu'un peut m'expliquer plus clairement.
    Merci beaucoup.

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    pour nMax, la plage commence à zéro , donc c'est normal que
    nMax soit égal à m_iRowCount - 1.
    pour le reste faudrait que je regarde plus en détail un peu plus tard

  3. #3
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par farscape Voir le message

    pour le reste faudrait que je regarde plus en détail un peu plus tard
    Merci, j'apprécierais beaucoup

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    pour moi aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nPage = (rectZoneVisible.Height() - colRect.Height()) / rowRect.Height();
    le nombre de page c'est la surface cliente sans le headerctrl divisée par la hauteur d'une colonne.
    vérifie tes valeurs en mode trace debug.

  5. #5
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par farscape Voir le message
    le nombre de page c'est la surface cliente sans le headerctrl divisée par la hauteur d'une colonne.
    vérifie tes valeurs en mode trace debug.
    Est-ce qeu tu voulais dire ;
    le nombre de page c'est la surface cliente sans le headerctrl divisée par la hauteur d'un row.
    ?

    Donc si j'ai bien compris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    nMin = 0;
     
    iVisibleItem = (rectZoneVisible.Height() - colRect.Height()) / 
    rowRect.Height();
    nMax = m_iRowCount - iVisibleItem;
     
    nPage= iVisibleItem;
    Est-ce que ça aurait du bon sens ?

  6. #6
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Bonjour,

    Quand je spécifie la valeur de nPage j'ai un problème bizarre. Voici l'algo :

    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
     
    if ( m_iRowCount * rowRect.Height() > rectZoneVisible.Height() - 
    colRect.Height() ) 
    { 
       // Afficher la scrollbar
       SCROLLINFO si; 
       si.cbSize = sizeof(SCROLLINFO); 
       si.fMask = SIF_ALL; 
       si.nPos = m_ScrollBarHiddenV.GetScrollPos(); 
       si.nMin = 0; 
       int iVisibleItem = (rectZoneVisible.Height() - colRect.Height()) / 
    rowRect.Height(); 
       si.nMax = m_iRowCount - iVisibleItem; 
       si.nPage = iVisibleItem; 
       si.nTrackPos = 0; 
       m_ScrollBarHiddenV.SetScrollInfo( &si, TRUE ); 
       ... 
    }
    Maintenant, voici quelques chiffres pour aider à comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Nombre d'item dans la liste (m_iRowCount)  : 25 
    Taille de la fenêtre (rectZoneVisible)          : 158px 
    Taille d'un colonne (colRect)                     : 19px 
    Taille d'une ligne (rowRect)                       : 17px
    Si je met un point d'arrêt lorsque j'intercepte le message WM_HSCROLL et que je récupère le ScrollInfo de ma ScrollBar verticale alors voici ce que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nMin = 0; 
    nMax = 17;
    À mon avis tout est correct jusqu'ici, parcontre si je clique sur le bouton (bas) de la srollbar jusqu'à son maximum alors j'obtiens 10 pour nPos. Pourquoi je n'obtiens pas 17 ?

    Est-ce moi qui est dans la lune ou il y a quelque chose que je ne comprend pas... ?

    Merci

Discussions similaires

  1. [Debutant]creer une requete pour une liste deroulante
    Par torNAdE dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/07/2006, 15h22
  2. Réponses: 3
    Dernier message: 30/06/2006, 09h41
  3. Réponses: 3
    Dernier message: 13/04/2006, 18h04
  4. implémenter la notion "au moins" pour une liste d'
    Par mohamed dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 18/08/2004, 00h07
  5. [Debutant(e)]conseil pour une liste ?
    Par Tymk dans le forum Débuter
    Réponses: 5
    Dernier message: 05/08/2004, 14h33

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