À propos des barres de défilement

Une fenêtre peut afficher un objet de données, tel qu’un document ou une bitmap, qui est plus grand que la zone cliente de la fenêtre. Lorsqu’une barre de défilement est fournie, l’utilisateur peut faire défiler un objet de données dans la zone cliente pour afficher les parties de l’objet qui s’étendent au-delà des bordures de la fenêtre.

Les barres de défilement doivent être incluses dans toutes les fenêtres pour lesquelles le contenu de la zone cliente s’étend au-delà des bordures de la fenêtre. L’orientation d’une barre de défilement détermine la direction dans laquelle le défilement se produit lorsque l’utilisateur utilise la barre de défilement. Une barre de défilement horizontale permet à l’utilisateur de faire défiler le contenu d’une fenêtre vers la gauche ou la droite. Une barre de défilement verticale permet à l’utilisateur de faire défiler le contenu vers le haut ou vers le bas.

Les rubriques suivantes sont traitées dans cette section.

Parties d’une barre de défilement

Une barre de défilement se compose d’un arbre ombré avec un bouton de flèche à chaque extrémité et d’une zone de défilement (parfois appelée pouce) entre les boutons de flèche. Une barre de défilement représente la longueur ou la largeur totale d’un objet de données dans la zone cliente d’une fenêtre ; la zone de défilement représente la partie de l’objet qui est visible dans la zone cliente. La position de la zone de défilement change chaque fois que l’utilisateur fait défiler un objet de données pour afficher une partie différente de celui-ci. Le système ajuste également la taille de la zone de défilement d’une barre de défilement afin qu’elle indique quelle partie de l’objet de données entier est actuellement visible dans la fenêtre. Si la plupart de l’objet est visible, la zone de défilement occupe la majeure partie de l’arbre de la barre de défilement. De même, si seule une petite partie de l’objet est visible, la zone de défilement occupe une petite partie de l’arbre de la barre de défilement.

L’utilisateur fait défiler le contenu d’une fenêtre en cliquant sur l’un des boutons de flèche, en cliquant sur la zone dans l’arbre de barre de défilement ombré ou en faisant glisser la zone de défilement. Lorsque l’utilisateur clique sur un bouton de flèche, l’application fait défiler le contenu d’une unité (généralement une seule ligne ou colonne). Lorsque l’utilisateur clique sur les zones ombrées, l’application fait défiler le contenu d’une fenêtre. La quantité de défilement qui se produit lorsque l’utilisateur fait glisser la zone de défilement dépend de la distance que l’utilisateur fait glisser la zone de défilement et de la plage de défilement de la barre de défilement. Pour plus d’informations sur la plage de défilement, consultez Position de la zone de défilement et Plage de défilement.

La capture d’écran suivante montre un contrôle d’édition enrichi avec des barres de défilement verticales et horizontales, telles qu’elles peuvent apparaître dans Windows Vista. La barre de défilement verticale est actuellement « chaude », car le pointeur de la souris pointait dessus lors de la capture d’écran.

capture d’écran d’un contrôle d’édition enrichi avec des barres de défilement

Barres de défilement standard et contrôles de barre de défilement

Une barre de défilement est incluse dans une fenêtre en tant que barre de défilement standard ou en tant que contrôle de barre de défilement. Une barre de défilement standard se trouve dans la zone non cliente d’une fenêtre. Il est créé avec la fenêtre et affiché lorsque la fenêtre est affichée. Le seul objectif d’une barre de défilement standard est de permettre à l’utilisateur de générer des demandes de défilement pour afficher l’intégralité du contenu de la zone cliente. Vous pouvez inclure une barre de défilement standard dans une fenêtre en spécifiant WS_HSCROLL, WS_VSCROLL ou les deux styles lorsque vous créez la fenêtre. Le style WS_HSCROLL crée une barre de défilement horizontale positionnée en bas de la zone cliente. Le style WS_VSCROLL crée une barre de défilement verticale située à droite de la zone cliente. Les valeurs de métriques système SM_CXHSCROLL et SM_CYHSCROLL définissent la largeur et la hauteur d’une barre de défilement horizontale standard. Les valeurs SM_CXVSCROLL et SM_CYVSCROLL définissent la largeur et la hauteur d’une barre de défilement verticale standard. Une barre de défilement standard fait partie de sa fenêtre associée et n’a donc pas de handle de fenêtre propre.

Un contrôle de barre de défilement est une fenêtre de contrôle qui appartient à la classe de fenêtre SCROLLBAR. Un contrôle de barre de défilement apparaît et fonctionne comme une barre de défilement standard, mais il s’agit d’une fenêtre distincte. En tant que fenêtre distincte, un contrôle de barre de défilement prend le focus d’entrée directe. Contrairement à une barre de défilement standard, un contrôle de barre de défilement dispose également d’une interface clavier intégrée.

Vous pouvez utiliser autant de contrôles de barre de défilement que nécessaire dans une seule fenêtre. Lorsque vous créez un contrôle de barre de défilement, vous devez spécifier la taille et la position de la barre de défilement. Toutefois, si la fenêtre d’un contrôle de barre de défilement peut être redimensionnée, des ajustements de la taille de la barre de défilement doivent être effectués chaque fois que la taille de la fenêtre change.

L’avantage de l’utilisation d’une barre de défilement standard est que le système crée la barre de défilement et définit automatiquement sa taille et sa position. Toutefois, les barres de défilement standard sont parfois trop restrictives. Par exemple, supposons que vous souhaitiez diviser une zone cliente en quadrants et utiliser un ensemble distinct de barres de défilement pour contrôler le contenu de chaque quadrant. Vous ne pouvez pas utiliser de barres de défilement standard, car vous ne pouvez créer qu’un seul ensemble de barres de défilement pour une fenêtre particulière. Utilisez plutôt des contrôles de barre de défilement, car vous pouvez en ajouter autant que vous le souhaitez à une fenêtre.

Les applications peuvent fournir des contrôles de barre de défilement à d’autres fins que le défilement du contenu d’une fenêtre. Par exemple, une application d’économiseur d’écran peut fournir une barre de défilement pour définir la vitesse à laquelle les graphiques sont déplacés sur l’écran.

Un contrôle de barre de défilement peut avoir un certain nombre de styles qui servent à contrôler l’orientation et la position de la barre de défilement. Vous spécifiez les styles souhaités lorsque vous appelez la fonction CreateWindowEx pour créer un contrôle de barre de défilement. Certains styles créent un contrôle de barre de défilement qui utilise une largeur ou une hauteur par défaut. Toutefois, vous devez toujours spécifier les coordonnées x et y, ainsi que les autres dimensions de la barre de défilement.

Pour obtenir un tableau des styles de contrôle de barre de défilement, consultez Styles de contrôle de barre de défilement.

Notes

Pour utiliser des styles visuels avec des barres de défilement, une application doit inclure un manifeste et appeler InitCommonControls au début du programme. Pour plus d’informations sur les styles visuels, consultez Styles visuels. Pour plus d’informations sur les manifestes, consultez Activation des styles visuels.

 

Position de la zone de défilement et plage de défilement

La position de la zone de défilement est représentée sous la forme d’un entier ; elle est relative à l’extrémité gauche ou supérieure de la barre de défilement, selon que la barre de défilement est horizontale ou verticale. La position doit être comprise dans les valeurs minimales et maximales de la plage de défilement. Par exemple, dans une barre de défilement dont la plage est comprise entre 0 et 100, la position 50 se trouve au milieu, les positions restantes étant réparties à parts égales le long de la barre de défilement. La plage initiale dépend de la barre de défilement. Les barres de défilement standard ont une plage initiale de 0 à 100 ; Les contrôles de barre de défilement ont une plage vide (les valeurs minimales et maximales sont égales à zéro), sauf si vous fournissez une plage explicite lors de la création du contrôle. Vous pouvez modifier la plage à tout moment. Vous pouvez utiliser la fonction SetScrollInfo pour définir les valeurs de plage et la fonction GetScrollInfo pour récupérer les valeurs de plage actuelles.

Une application ajuste généralement la plage de défilement à des entiers pratiques, ce qui facilite la traduction de la position de la zone de défilement en une valeur correspondant à l’objet de données à faire défiler. Par exemple, si une application doit afficher 260 lignes d’un fichier texte dans une fenêtre qui ne peut afficher que 16 lignes à la fois, la plage de barres de défilement verticale peut être définie sur 1 à 244. Si la zone de défilement se trouve à la position 1, la première ligne se trouve en haut de la fenêtre. Si la zone de défilement se trouve à la position 244, la dernière ligne (ligne 260) se trouve en bas de la fenêtre. Si une application tente de spécifier une valeur de position inférieure à la valeur minimale ou supérieure à la valeur maximale, la valeur de plage de défilement minimale ou maximale est utilisée à la place.

Vous pouvez définir une taille de page pour une barre de défilement. La taille de la page représente le nombre d’unités de données pouvant tenir dans la zone cliente de la fenêtre propriétaire en fonction de sa taille actuelle. Par exemple, si la zone cliente peut contenir 16 lignes de texte, une application définit la taille de la page sur 16. Le système utilise la taille de la page, ainsi que la plage de défilement et la longueur de l’arbre de barre de défilement, pour définir la taille de la zone de défilement. Chaque fois qu’une fenêtre contenant une barre de défilement est redimensionnée, une application doit appeler la fonction SetScrollInfo pour définir la taille de la page. Une application peut récupérer la taille de page actuelle en appelant la fonction GetScrollInfo d’envoi.

Pour établir une relation utile entre la plage de barres de défilement et l’objet de données, une application doit ajuster la plage chaque fois que la taille de l’objet de données change.

Lorsque l’utilisateur déplace la zone de défilement dans une barre de défilement, la barre de défilement indique la position de la zone de défilement sous la forme d’un entier dans la plage de défilement. Si la position est la valeur minimale, la zone de défilement se trouve en haut d’une barre de défilement verticale ou à l’extrémité gauche d’une barre de défilement horizontale. Si la position est la valeur maximale, la zone de défilement se trouve en bas d’une barre de défilement verticale ou à l’extrémité droite d’une barre de défilement horizontale.

La valeur maximale qu’une barre de défilement peut signaler (c’est-à-dire la position de défilement maximale) dépend de la taille de la page. Si la barre de défilement a une taille de page supérieure à 1, la position de défilement maximale est inférieure à la valeur de plage maximale. Vous pouvez utiliser la formule suivante pour calculer la position de défilement maximale :

MaxScrollPos = MaxRangeValue - (PageSize - 1) 

Une application doit déplacer la zone de défilement dans une barre de défilement. Bien que l’utilisateur effectue une demande de défilement dans une barre de défilement, la barre de défilement ne met pas automatiquement à jour la position de la zone de défilement. Au lieu de cela, il transmet la requête à la fenêtre parente, qui doit faire défiler les données et mettre à jour la position de la zone de défilement. Une application utilise la fonction SetScrollInfo pour mettre à jour la position de la zone de défilement ; sinon, elle utilise la fonction SetScrollPos . Étant donné qu’elle contrôle le mouvement de la zone de défilement, l’application peut déplacer la zone de défilement par incréments qui fonctionnent le mieux pour les données en cours de défilement.

Visibilité de la barre de défilement

Le système masque et désactive une barre de défilement standard lorsque des valeurs minimales et maximales égales sont spécifiées. Le système masque et désactive également une barre de défilement standard si vous spécifiez une taille de page qui inclut l’ensemble de la plage de défilement de la barre de défilement. C’est le moyen de masquer temporairement une barre de défilement lorsqu’elle n’est pas nécessaire pour le contenu de la zone cliente. Il n’est pas nécessaire d’effectuer des demandes de défilement dans la barre de défilement lorsqu’elle est masquée. Le système active la barre de défilement et l’affiche à nouveau lorsque vous définissez les valeurs minimales et maximales sur des valeurs inégales et lorsque la taille de page n’inclut pas toute la plage de défilement. La fonction ShowScrollBar peut également être utilisée pour masquer ou afficher une barre de défilement. Cela n’affecte pas la plage, la taille de la page ou la position de la zone de défilement de la barre de défilement.

La fonction EnableScrollBar peut être utilisée pour désactiver une ou les deux flèches d’une barre de défilement. Une application affiche les flèches désactivées en gris et ne répond pas aux entrées utilisateur.

Demandes de barre de défilement

L’utilisateur effectue des demandes de défilement en cliquant sur différentes parties d’une barre de défilement. Le système envoie la demande à la fenêtre spécifiée sous la forme d’un message WM_HSCROLL ou WM_VSCROLL . Une barre de défilement horizontale envoie le message WM_HSCROLL ; une barre de défilement verticale envoie le message WM_VSCROLL . Chaque message inclut un code de requête qui correspond à l’action de l’utilisateur, à la poignée de la barre de défilement (contrôles de barre de défilement uniquement) et, dans certains cas, à la position de la zone de défilement.

Le diagramme suivant montre le code de requête que l’utilisateur génère lorsqu’il clique sur différentes parties d’une barre de défilement.

diagramme montrant les codes de requête associés à chaque région sur deux barres de défilement

Les valeurs SB_ spécifient l’action que l’utilisateur effectue. Une application examine les codes qui accompagnent les messages WM_HSCROLL et WM_VSCROLL , puis effectue l’opération de défilement appropriée. Dans le tableau suivant, l’action de l’utilisateur est spécifiée pour chaque valeur, suivie de la réponse de l’application. Dans chaque cas, une unité est définie par l’application en fonction des données. Par exemple, l’unité classique pour faire défiler le texte verticalement est une ligne de texte.

Requête Action response
SB_LINEUP L’utilisateur clique sur la flèche de défilement supérieure. Décrémente la position de la zone de défilement ; fait défiler vers le haut des données d’une unité.
SB_LINEDOWN L’utilisateur clique sur la flèche de défilement inférieure. Incrémente la position de la zone de défilement ; fait défiler vers le bas des données d’une unité.
SB_LINELEFT L’utilisateur clique sur la flèche de défilement gauche. Décrémente la position de la zone de défilement ; fait défiler vers l’extrémité gauche des données d’une unité.
SB_LINERIGHT L’utilisateur clique sur la flèche de défilement droite. Incrémente la position de la zone de défilement ; fait défiler vers l’extrémité droite des données d’une unité.
SB_PAGEUP L’utilisateur clique sur l’arbre de barre de défilement au-dessus de la zone de défilement. Décrémente la position de la zone de défilement en fonction du nombre d’unités de données dans la fenêtre ; fait défiler vers le haut des données le même nombre d’unités.
SB_PAGEDOWN L’utilisateur clique sur l’arbre de barre de défilement sous la zone de défilement. Incrémente la position de la zone de défilement en fonction du nombre d’unités de données dans la fenêtre ; fait défiler vers le bas des données le même nombre d’unités.
SB_PAGELEFT L’utilisateur clique sur l’axe de la barre de défilement à gauche de la zone de défilement. Décrémente la position de la zone de défilement en fonction du nombre d’unités de données dans la fenêtre ; fait défiler vers l’extrémité gauche des données le même nombre d’unités.
SB_PAGERIGHT L’utilisateur clique sur l’axe de la barre de défilement à droite de la zone de défilement. Incrémente la position de la zone de défilement en fonction du nombre d’unités de données dans la fenêtre ; fait défiler vers l’extrémité droite des données le même nombre d’unités.
SB_THUMBPOSITION L’utilisateur libère la zone de défilement après l’avoir fait glisser. Définit la zone de défilement sur la position spécifiée dans le message ; fait défiler les données selon le même nombre d’unités que la zone de défilement a déplacées.
SB_THUMBTRACK L’utilisateur fait glisser la zone de défilement. Définit la zone de défilement à la position spécifiée dans le message et fait défiler les données selon le même nombre d’unités que celle-ci a déplacées pour les applications qui dessinent rapidement des données. Les applications qui ne peuvent pas dessiner des données rapidement doivent attendre le code de requête SB_THUMBPOSITION avant de déplacer la zone de défilement et de faire défiler les données.
SB_ENDSCROLL L’utilisateur relâche la souris après l’avoir enfoncée sur une flèche ou dans l’axe de la barre de défilement. Aucune réponse n’est nécessaire.

 

Une barre de défilement génère SB_THUMBPOSITION et SB_THUMBTRACK code de requête lorsque l’utilisateur clique et fait glisser la zone de défilement. Une application doit être programmée pour traiter le code de requête SB_THUMBTRACK ou SB_THUMBPOSITION.

Le code de requête SB_THUMBPOSITION se produit lorsque l’utilisateur relâche le bouton de la souris après avoir cliqué sur la zone de défilement. Une application qui traite ce message effectue l’opération de défilement une fois que l’utilisateur a fait glisser la zone de défilement vers la position souhaitée et relâché le bouton de la souris.

Le code de requête SB_THUMBTRACK se produit lorsque l’utilisateur fait glisser la zone de défilement. Si une application traite SB_THUMBTRACK codes de requête, elle peut faire défiler le contenu d’une fenêtre lorsque l’utilisateur fait glisser la zone de défilement. Toutefois, une barre de défilement peut générer de nombreux SB_THUMBTRACK code de requête en peu de temps. Par conséquent, une application ne doit traiter ces codes de requête que si elle peut rapidement repeindre le contenu de la fenêtre.

Interface clavier pour une barre de défilement

Un contrôle de barre de défilement fournit une interface clavier intégrée qui permet à l’utilisateur d’émettre des demandes de défilement à l’aide du clavier ; une barre de défilement standard ne le fait pas. Lorsqu’un contrôle de barre de défilement a le focus clavier, il envoie WM_HSCROLL et WM_VSCROLL messages à sa fenêtre parente lorsque l’utilisateur appuie sur les touches de direction. Le code de requête est envoyé avec chaque message correspondant à la flèche enfoncée par l’utilisateur. Voici les touches de direction et les codes de requête correspondants.

Flèche Demander un code
INACTIF SB_LINEDOWN ou SB_LINERIGHT
FIN SB_BOTTOM
Origine SB_TOP
LEFT SB_LINEUP ou SB_LINELEFT
PGDN SB_PAGEDOWN ou SB_PAGERIGHT
PGUP SB_PAGEUP ou SB_PAGELEFT
RIGHT SB_LINEDOWN ou SB_LINERIGHT
UP SB_LINEUP ou SB_LINELEFT

 

 

Notes

L’interface clavier d’un contrôle de barre de défilement envoie les codes de requête SB_TOP et SB_BOTTOM. Le code de requête SB_TOP indique que l’utilisateur a atteint la valeur supérieure de la plage de défilement. Une application fait défiler le contenu de la fenêtre vers le bas afin que le haut de l’objet de données soit visible. Le code de requête SB_BOTTOM indique que l’utilisateur a atteint la valeur inférieure de la plage de défilement. Si une application traite le code de requête SB_BOTTOM, elle fait défiler le contenu de la fenêtre vers le haut afin que le bas de l’objet de données soit visible.

 

Si vous souhaitez une interface clavier pour une barre de défilement standard, vous pouvez en créer une vous-même en traitant le message WM_KEYDOWN dans votre procédure de fenêtre, puis en effectuant l’action de défilement appropriée en fonction du code de touche virtuelle qui accompagne le message. Pour plus d’informations sur la création d’une interface clavier pour une barre de défilement, consultez Création d’une interface clavier pour une barre de défilement standard.

Défilement de la zone cliente

Le moyen le plus simple de faire défiler le contenu d’une zone cliente consiste à l’effacer, puis à le redessiner. Il s’agit de la méthode qu’une application est susceptible d’utiliser avec SB_PAGEUP, SB_PAGEDOWN et SB_TOP codes de requête, qui nécessitent généralement un contenu entièrement nouveau.

Pour certains codes de requête, tels que SB_LINEUP et SB_LINEDOWN, tout le contenu n’a pas besoin d’être effacé, car certains restent visibles après le défilement. La fonction ScrollWindowEx conserve une partie du contenu de la zone cliente, déplace la partie conservée d’une quantité spécifiée, puis prépare le reste de la zone client pour la peinture de nouvelles informations. ScrollWindowEx utilise la fonction BitBlt pour déplacer une partie spécifique de l’objet de données vers un nouvel emplacement dans la zone cliente. Toute partie découverte de la zone client (tout ce qui n’est pas conservé) est invalidée, effacée et peinte lorsque le message WM_PAINT suivant se produit.

La fonction ScrollWindowEx peut être utilisée pour exclure une partie de la zone cliente de l’opération de défilement. Cela empêche les éléments avec des positions fixes, telles que les fenêtres enfants, de se déplacer dans la zone cliente. Il invalide automatiquement la partie de la zone cliente qui doit recevoir les nouvelles informations, de sorte que l’application n’a pas à calculer ses propres régions de découpage. Pour plus d’informations sur le découpage, consultez Découpage.

En règle générale, une application fait défiler le contenu d’une fenêtre dans le sens inverse indiqué par la barre de défilement. Par exemple, lorsque l’utilisateur clique sur l’arbre de barre de défilement dans la zone située sous la zone de défilement, une application fait défiler l’objet dans la fenêtre vers le haut pour révéler une partie de l’objet qui se trouve sous la partie visible.

Vous pouvez également faire défiler une région rectangulaire à l’aide de la fonction ScrollDC .

Couleurs et métriques de barre de défilement

La valeur de couleur définie par le système, COLOR_SCROLLBAR, contrôle la couleur dans un arbre de barre de défilement. Utilisez la fonction GetSysColor pour déterminer la couleur de l’arbre de barre de défilement et la fonction SetSysColors pour définir la couleur de l’arbre de la barre de défilement. Notez toutefois que ce changement de couleur affecte toutes les barres de défilement du système.

Vous pouvez obtenir les dimensions des bitmaps que le système utilise dans les barres de défilement standard en appelant la fonction GetSystemMetrics . Voici les valeurs de métrique système associées aux barres de défilement.

Métrique système Description
SM_CXHSCROLL Largeur de l’image bitmap de flèche sur la barre de défilement horizontale
SM_CXHTHUMB Largeur de la zone de défilement sur la barre de défilement horizontale. Cette valeur récupère la largeur d’une barre de défilement dont la taille de page est égale à zéro.
SM_CXVSCROLL Largeur de l’image bitmap de flèche sur la barre de défilement verticale
SM_CYHSCROLL Hauteur de l’image bitmap de flèche sur la barre de défilement horizontale
SM_CYVSCROLL Hauteur de l’image bitmap de flèche sur la barre de défilement verticale
SM_CYVTHUMB Hauteur de la zone de défilement sur la barre de défilement verticale. Cette valeur récupère la hauteur d’une barre de défilement dont la taille de page est égale à zéro.