Partager via


À propos des zones de liste

Un contrôle de zone de liste contient une liste simple à partir de laquelle l’utilisateur peut généralement sélectionner un ou plusieurs éléments. Les zones de liste offrent une flexibilité limitée par rapport aux contrôles Affichage de liste .

Les éléments de zone de liste peuvent être représentés par des chaînes de texte, des bitmaps ou les deux. Si la zone de liste n’est pas assez grande pour afficher tous les éléments de la zone de liste à la fois, la zone de liste fournit une barre de défilement. L’utilisateur fait défiler les éléments de la zone de liste et applique ou supprime les status de sélection si nécessaire. La sélection d’un élément de zone de liste modifie son apparence visuelle, généralement en remplaçant les couleurs de texte et d’arrière-plan par celles spécifiées par les métriques du système d’exploitation pertinentes. Lorsque l’utilisateur sélectionne ou désélectionne un élément, le système envoie un message de notification à la fenêtre parente de la zone de liste.

Pour une application ANSI, le système convertit le texte d’une zone de liste en Unicode à l’aide de la page de codes CP_ACP . Cela peut entraîner des problèmes. Par exemple, les caractères romains accentués dans une zone de liste non-Unicode dans Windows, la version japonaise sortira brouillée. Pour résoudre ce problème, compilez l’application au format Unicode ou utilisez une zone de liste dessinée par le propriétaire.

Cette section traite des sujets suivants :

Création d’une zone de liste

Le moyen le plus simple de créer une zone de liste dans une boîte de dialogue consiste à la faire glisser de la boîte à outils de Microsoft Visual Studio vers votre ressource de boîte de dialogue. Pour créer une zone de liste de manière dynamique, ou pour créer une zone de liste dans une fenêtre autre qu’une boîte de dialogue, utilisez la fonction CreateWindowEx , en spécifiant la classe de fenêtre WC_LISTBOX et les styles de zone de liste appropriés.

Types et styles de zone de liste

Il existe deux types de zones de liste : sélection unique (par défaut) et sélection multiple. Dans une zone de liste à sélection unique, l’utilisateur ne peut sélectionner qu’un seul élément à la fois. Dans une zone de liste à sélection multiple, l’utilisateur peut sélectionner plusieurs éléments à la fois. Pour créer une zone de liste à sélection multiple, spécifiez le style LBS_MULTIPLESEL ou LBS_EXTENDEDSEL .

L’apparence et le fonctionnement d’une zone de liste sont contrôlés par les styles de zone de liste et les styles de fenêtre. Ces styles indiquent si la liste est triée, organisée en plusieurs colonnes, dessinée par l’application, etc. Les dimensions et les styles d’une zone de liste sont généralement définis dans un modèle de boîte de dialogue inclus dans les ressources d’une application.

Notes

Pour utiliser des styles visuels avec ces contrôles, 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.

Fonctions de zone de liste

La fonction DlgDirList remplace le contenu d’une zone de liste par les noms des lecteurs, répertoires et fichiers qui correspondent à un ensemble de critères spécifié. La fonction DlgDirSelectEx récupère la sélection actuelle dans une zone de liste initialisée par DlgDirList. Ces fonctions permettent à l’utilisateur de sélectionner un lecteur, un répertoire ou un fichier à partir d’une zone de liste sans taper l’emplacement et le nom du fichier.

En outre, la fonction GetListBoxInfo retourne le nombre d’éléments par colonne dans une zone de liste spécifiée.

Messages de notification à partir de zones de liste

Lorsqu’un événement se produit dans une zone de liste, la zone de liste envoie un code de notification, sous la forme d’un message WM_COMMAND , à la procédure de boîte de dialogue de la fenêtre propriétaire. Les codes de notification de zone de liste sont envoyés lorsqu’un utilisateur sélectionne, double-clique ou annule un élément de zone de liste ; lorsque la zone de liste reçoit ou perd le focus clavier ; et lorsque le système ne peut pas allouer suffisamment de mémoire pour une demande de zone de liste. Un message WM_COMMAND contient l’identificateur de zone de liste dans le mot d’ordre inférieur du paramètre wParam et le code de notification dans le mot d’ordre supérieur. Le paramètre lParam contient le handle de fenêtre de contrôle.

Une procédure de boîte de dialogue n’est pas nécessaire pour traiter ces messages ; la procédure de fenêtre par défaut les traite.

Une application doit surveiller et traiter les codes de notification de zone de liste suivants.

Code de notification Description
LBN_DBLCLK L’utilisateur double-clique sur un élément dans la zone de liste.
LBN_ERRSPACE La zone de liste ne peut pas allouer suffisamment de mémoire pour répondre à une demande.
LBN_KILLFOCUS La zone de liste perd le focus clavier.
LBN_SELCANCEL L’utilisateur annule la sélection d’un élément dans la zone de liste.
LBN_SELCHANGE La sélection dans une zone de liste est sur le point de changer.
LBN_SETFOCUS La zone de liste reçoit le focus clavier.

Messages vers les zones de liste

Une procédure de boîte de dialogue peut envoyer des messages à une zone de liste pour ajouter, supprimer, examiner et modifier des éléments de zone de liste. Par exemple, une procédure de boîte de dialogue peut envoyer un message LB_ADDSTRING à une zone de liste pour ajouter un élément, et un message LB_GETSEL pour déterminer si l’élément est sélectionné. D’autres messages définissent et récupèrent des informations sur la taille, l’apparence et le comportement de la zone de liste. Par exemple, le message LB_SETHORIZONTALEXTENT définit la largeur de défilement d’une zone de liste. Une procédure de boîte de dialogue peut envoyer n’importe quel message à une zone de liste à l’aide de la fonction SendMessage ou SendDlgItemMessage .

Un élément de zone de liste est souvent référencé par son index, un entier qui représente la position de l’élément dans la zone de liste. L’index du premier élément d’une zone de liste est 0, l’index du deuxième élément est 1, et ainsi de suite.

Le tableau suivant décrit la façon dont la procédure de zone de liste prédéfinie répond aux messages de zone de liste.

Message response
LB_ADDFILE Insère un fichier dans une zone de liste de répertoires qui est remplie par la fonction DlgDirList et récupère l’index de la zone de liste de l’élément inséré.
LB_ADDSTRING Ajoute une chaîne à une zone de liste et retourne son index.
LB_DELETESTRING Supprime une chaîne d’une zone de liste et retourne le nombre de chaînes qui restent dans la liste.
LB_DIR Ajoute une liste de noms de fichiers à une zone de liste et retourne l’index du nom de fichier ajouté.
LB_FINDSTRING Retourne l’index de la première chaîne dans la zone de liste qui commence par une chaîne spécifiée.
LB_FINDSTRINGEXACT Retourne l’index de la chaîne dans la zone de liste qui est égal à une chaîne spécifiée.
LB_GETANCHORINDEX Retourne l’index de l’élément que la souris a sélectionné pour la dernière fois.
LB_GETCARETINDEX Retourne l’index de l’élément qui a le rectangle de focus.
LB_GETCOUNT Retourne le nombre d’éléments dans la zone de liste.
LB_GETCURSEL Retourne l’index de l’élément actuellement sélectionné.
LB_GETHORIZONTALEXTENT Retourne la largeur de défilement, en pixels, d’une zone de liste.
LB_GETITEMDATA Retourne la valeur associée à l’élément spécifié.
LB_GETITEMHEIGHT Retourne la hauteur, en pixels, d’un élément dans une zone de liste.
LB_GETITEMRECT Récupère les coordonnées client de l’élément de zone de liste spécifié.
LB_GETLOCALE Récupère les paramètres régionaux de la zone de liste. Le mot d’ordre élevé contient le code pays/région et le mot de bas ordre contient l’identificateur de langue.
LB_GETSEL Retourne l’état de sélection d’un élément de zone de liste.
LB_GETSELCOUNT Retourne le nombre d’éléments sélectionnés dans une zone de liste à sélection multiple.
LB_GETSELITEMS Crée un tableau des index de tous les éléments sélectionnés dans une zone de liste à sélection multiple et retourne le nombre total d’éléments sélectionnés.
LB_GETTEXT Récupère la chaîne associée à un élément spécifié et la longueur de la chaîne.
LB_GETTEXTLEN Retourne la longueur, en caractères, de la chaîne associée à un élément spécifié.
LB_GETTOPINDEX Retourne l’index du premier élément visible dans une zone de liste.
LB_INITSTORAGE Alloue de la mémoire pour le nombre spécifié d’éléments et les chaînes associées.
LB_INSERTSTRING Insère une chaîne à un index spécifié dans une zone de liste.
LB_ITEMFROMPOINT Récupère l’index de base zéro de l’élément le plus proche du point spécifié dans une zone de liste.
LB_RESETCONTENT Supprime tous les éléments d’une zone de liste.
LB_SELECTSTRING Sélectionne la première chaîne qui correspond à un préfixe spécifié.
LB_SELITEMRANGE Sélectionne une plage d’éléments spécifiée dans une zone de liste.
LB_SELITEMRANGEEX Sélectionne une plage d’éléments spécifiée si l’index du premier élément de la plage est inférieur à l’index du dernier élément de la plage. Annule la sélection dans la plage si l’index du premier élément est supérieur au dernier.
LB_SETANCHORINDEX Définit l’élément que la souris a sélectionné en dernier sur un élément spécifié.
LB_SETCARETINDEX Définit le rectangle de focus sur un élément de zone de liste spécifié.
LB_SETCOLUMNWIDTH Définit la largeur, en pixels, de toutes les colonnes d’une zone de liste.
LB_SETCOUNT Définit le nombre d’éléments dans une zone de liste.
LB_SETCURSEL Sélectionne un élément de zone de liste spécifié.
LB_SETHORIZONTALEXTENT Définit la largeur de défilement, en pixels, d’une zone de liste.
LB_SETITEMDATA Associe une valeur à un élément de zone de liste.
LB_SETITEMHEIGHT Définit la hauteur, en pixels, d’un ou plusieurs éléments d’une zone de liste.
LB_SETLOCALE Définit les paramètres régionaux d’une zone de liste et retourne l’identificateur de paramètres régionaux précédent.
LB_SETSEL Sélectionne un élément dans une zone de liste à sélection multiple.
LB_SETTABSTOPS Définit les taquets de tabulation sur ceux spécifiés dans un tableau spécifié.
LB_SETTOPINDEX Fait défiler la zone de liste pour que l’élément spécifié se trouve en haut de la plage visible.

Traitement des messages de fenêtre par défaut

La procédure de fenêtre de la classe de fenêtre de zone de liste prédéfinie effectue le traitement par défaut de tous les messages que la zone de liste ne traite pas. Lorsque la procédure de zone de liste retourne FALSE pour un message, la procédure de fenêtre prédéfinie vérifie le message et effectue des actions par défaut, comme indiqué dans le tableau suivant.

Message Action par défaut
WM_CHAR Déplace la sélection vers le premier élément qui commence par le caractère que l’utilisateur a tapé. Si la zone de liste a le style LBS_OWNERDRAW , aucune action ne se produit. Plusieurs caractères tapés dans un court intervalle sont traités comme un groupe, et le premier élément qui commence par cette série de caractères est sélectionné.
WM_CREATE Crée une zone de liste vide.
WM_DESTROY Détruit la zone de liste et libère toutes les ressources qu’il utilise.
Transmet le message à la procédure de boîte de dialogue ou au processus de fenêtre parente.
WM_ENABLE Si le contrôle est visible, invalide le rectangle afin que les chaînes puissent être peintes en gris.
WM_ERASEBKGND Efface l’arrière-plan d’une zone de liste. Si la zone de liste a le style LBS_OWNERDRAW , l’arrière-plan n’est pas effacé.
WM_GETDLGCODE Retourne DLGC_WANTARROWS | DLGC_WANTCHARS, indiquant que la procédure de zone de liste par défaut traite les touches de direction et WM_CHAR messages.
WM_GETFONT Retourne un handle à la police active pour la zone de liste.
WM_HSCROLL Fait défiler la zone de liste horizontalement.
WM_KEYDOWN Traite les clés virtuelles pour le défilement. La clé virtuelle est l’index de l’élément vers lequel déplacer le caret. La sélection n’est pas modifiée.
WM_KILLFOCUS Désactive le caret et le détruit. Envoie un code de notification LBN_KILLFOCUS au propriétaire de la zone de liste.
WM_LBUTTONDBLCLK Suit la souris dans la zone cliente de la zone de liste. Cela permet à l’utilisateur d’annuler une sélection si le bouton de la souris est relâché en dehors de la zone cliente de la zone de liste.
WM_LBUTTONDOWN Suit la souris dans la zone cliente de la zone de liste. Cela permet à l’utilisateur d’annuler une sélection si le bouton de la souris est relâché en dehors de la zone cliente de la zone de liste.
WM_LBUTTONUP Suit la souris dans la zone cliente de la zone de liste. Cela permet à l’utilisateur d’annuler une sélection si le bouton de la souris est relâché en dehors de la zone cliente de la zone de liste.
WM_MOUSEMOVE Suit la souris dans la zone cliente de la zone de liste. Cela permet à l’utilisateur d’annuler une sélection si le bouton de la souris est relâché en dehors de la zone cliente de la zone de liste.
WM_PAINT Effectue une opération de peinture sous-classée à l’aide du handle de zone de liste dans le contexte de l’appareil (DC).
WM_SETFOCUS Active le caret et envoie un code de notification LBN_SETFOCUS au propriétaire de la zone de liste.
WM_SETFONT Définit une nouvelle police pour la zone de liste.
WM_SETREDRAW Définit ou efface l’indicateur de redessinage en fonction de la valeur de wParam.
WM_SIZE Redimensionne la zone de liste en un nombre intégral d’éléments.
WM_VSCROLL Fait défiler la zone de liste verticalement.

La procédure de zone de liste prédéfinie transmet tous les autres messages à DefWindowProc pour le traitement par défaut.

Owner-Drawn zones de liste

Une application peut créer une zone de liste dessinée par le propriétaire pour assumer la responsabilité de la peinture des éléments de liste. La fenêtre parente ou la boîte de dialogue d’une zone de liste dessinée par le propriétaire (son propriétaire) reçoit WM_DRAWITEM messages lorsqu’une partie de la zone de liste doit être peinte. Une zone de liste dessinée par le propriétaire peut répertorier des informations autres que, ou en plus, des chaînes de texte.

Le propriétaire d’une zone de liste dessinée par le propriétaire doit traiter le message WM_DRAWITEM . Ce message est envoyé chaque fois qu’une partie de la zone de liste doit être redessinée. Le propriétaire peut avoir besoin de traiter d’autres messages, en fonction des styles spécifiés pour la zone de liste.

Une application peut créer une zone de liste dessinée par le propriétaire en spécifiant le style LBS_OWNERDRAWFIXED ou LBS_OWNERDRAWVARIABLE . Si tous les éléments de liste de la zone de liste ont la même hauteur, comme des chaînes ou des icônes, une application peut utiliser le style LBS_OWNERDRAWFIXED . Si les éléments de liste ont une hauteur variable (par exemple, des bitmaps de taille différente), une application peut utiliser le style LBS_OWNERDRAWVARIABLE .

Le propriétaire d’une zone de liste dessinée par le propriétaire peut traiter un message WM_MEASUREITEM pour spécifier les dimensions des éléments de liste. Si l’application crée la zone de liste à l’aide du style LBS_OWNERDRAWFIXED , le système n’envoie le message WM_MEASUREITEM qu’une seule fois. Les dimensions spécifiées par le propriétaire sont utilisées pour tous les éléments de liste. Si le style LBS_OWNERDRAWVARIABLE est utilisé, le système envoie un message WM_MEASUREITEM pour chaque élément de liste ajouté à la zone de liste. Le propriétaire peut déterminer ou définir la hauteur d’un élément de liste à tout moment à l’aide des messages LB_GETITEMHEIGHT et LB_SETITEMHEIGHT , respectivement.

Si les informations affichées dans une zone de liste dessinée par le propriétaire incluent du texte, une application peut suivre le texte de chaque élément de liste en spécifiant le style LBS_HASSTRINGS . Les zones de liste avec le style LBS_SORT sont triées en fonction de ce texte. Si une zone de liste est triée, mais n’est pas du style LBS_HASSTRINGS , le propriétaire doit traiter le message WM_COMPAREITEM .

Dans une zone de liste dessinée par le propriétaire, le propriétaire doit effectuer le suivi des éléments de liste qui contiennent des informations autres que ou en plus du texte. Pour ce faire, vous pouvez enregistrer le handle dans les informations en tant que données d’élément à l’aide du message LB_SETITEMDATA . Pour libérer les objets de données associés aux éléments d’une zone de liste, le propriétaire peut traiter le message WM_DELETEITEM .

Pour obtenir un exemple de zone de liste dessinée par le propriétaire, consultez How to Create an Owner-Drawn List Box.

Faire glisser les zones de liste

Une zone de liste glisser est un type spécial de zone de liste qui permet à l’utilisateur de faire glisser des éléments d’un emplacement vers un autre. Une application peut utiliser une zone de liste glisser pour afficher des chaînes dans une séquence particulière et permettre à l’utilisateur de modifier la séquence en faisant glisser les éléments en position.

Création de zones de liste glisser

Les zones de liste de glisser ont les mêmes styles de fenêtre et traitent les mêmes messages que les zones de liste standard. Pour créer une zone de liste glisser, créez d’abord une zone de liste standard, puis appelez la fonction MakeDragList . Pour convertir une zone de liste d’une boîte de dialogue en zone de liste de glisser, vous pouvez appeler MakeDragList lorsque le WM_INITDIALOG message est traité.

Faire glisser les messages de zone de liste

Une zone de liste glisser avertit la fenêtre parente des événements de glisser en lui envoyant un message de liste de glisser. La fenêtre parente doit traiter le message de liste de glissement.

La zone de liste glisser enregistre ce message lorsque la fonction MakeDragList est appelée. Pour récupérer l’identificateur de message (valeur numérique) du message de liste de glisser, appelez la fonction RegisterWindowMessage et spécifiez la valeur DRAGLISTMSGSTRING.

Le paramètre wParam du message de liste de glisser est l’identificateur de contrôle de la zone de liste glisser. Le paramètre lParam est l’adresse d’une structure DRAGLISTINFO , qui contient le code de notification de l’événement de glisser et d’autres informations. La valeur de retour du message dépend de la notification.

Faire glisser les codes de notification de zone de liste

Le code de notification de liste de glisser, qui est identifié par le membre uNotification de la structure DRAGLISTINFO incluse avec le message de liste de glisser, peut être DL_BEGINDRAG, DL_DRAGGING, DL_CANCELDRAG ou DL_DROPPED.

Le code de notification DL_BEGINDRAG est envoyé lorsque le curseur se trouve sur un élément de liste et que l’utilisateur clique sur le bouton gauche de la souris. La fenêtre parente peut retourner TRUE pour commencer l’opération de glisser ou FALSE pour interdire le glissement. De cette façon, la fenêtre parente peut activer le glisser-déplacer pour certains éléments de liste et le désactiver pour d’autres. Vous pouvez déterminer quel élément de liste se trouve à l’emplacement spécifié à l’aide de la fonction LBItemFromPt .

Si le glissement est en vigueur, le code de notification DL_DRAGGING est envoyé chaque fois que la souris est déplacée, ou à intervalles réguliers si la souris n’est pas déplacée. La fenêtre parente doit d’abord déterminer l’élément de liste sous le curseur à l’aide de LBItemFromPt , puis dessiner l’icône d’insertion à l’aide de la fonction DrawInsert . En spécifiant TRUE pour le paramètre bAutoScroll de LBItemFromPt, vous pouvez faire défiler la zone de liste d’une ligne si le curseur se trouve au-dessus ou au-dessous de sa zone cliente. La valeur retournée pour cette notification spécifie le type de curseur de souris que la zone de liste glisser doit définir.

Le code de notification DL_CANCELDRAG est envoyé si l’utilisateur annule une opération de glissement en cliquant sur le bouton droit de la souris ou en appuyant sur la touche ÉCHAP. Le code de notification DL_DROPPED est envoyé si l’utilisateur termine une opération de glissement en relâchant le bouton gauche de la souris, même si le curseur ne se trouve pas sur un élément de liste. La zone de liste glisser libère la capture de la souris avant d’envoyer l’une ou l’autre notification. La valeur de retour de ces deux notifications est ignorée. Faire glisser la liste