À propos des zones de liste déroulante
Une zone de liste déroulante combine une zone d’édition ou du texte statique et une liste.
Cette rubrique contient les sections suivantes.
- Types et styles de zone de liste déroulante
- Liste de zones de liste déroulante
- Modifier les champs de sélection du contrôle
- Zones de liste déroulante dessinées par le propriétaire
- Zones de liste déroulante sous-classifiées
Types et styles de zone de liste déroulante
Une zone de liste modifiable se compose d’une liste et d’un champ de sélection. La liste présente les options qu’un utilisateur peut sélectionner, et le champ de sélection affiche la sélection actuelle. Si le champ de sélection est un contrôle d’édition, l’utilisateur peut entrer des informations qui ne sont pas disponibles dans la liste ; sinon, l’utilisateur ne peut sélectionner que les éléments de la liste.
La bibliothèque de contrôles communs comprend trois styles main de zone de liste modifiable, comme indiqué dans le tableau suivant.
Type de zone de liste déroulante | Constante de style | Description |
---|---|---|
Simple | CBS_SIMPLE | Affiche la liste à tout moment et affiche l’élément sélectionné dans un contrôle d’édition. |
Drop-down | CBS_DROPDOWN | Affiche la liste lorsque vous cliquez sur l’icône et affiche l’élément sélectionné dans un contrôle d’édition. |
Liste déroulante (liste déroulante) | CBS_DROPDOWNLIST | Affiche la liste lorsque vous cliquez sur l’icône et affiche l’élément sélectionné dans un contrôle statique. |
Les captures d’écran suivantes montrent chacune les trois types de zone de liste modifiable tels qu’ils peuvent apparaître dans Windows Vista. Dans la première capture d’écran, l’utilisateur a sélectionné un élément dans la zone de liste déroulante simple. L’utilisateur peut également taper une nouvelle valeur dans la zone d’édition de ce contrôle. La liste a été dimensionnée dans l’éditeur de ressources Microsoft Visual Studio et est seulement assez grande pour prendre en charge deux éléments.
Dans la deuxième capture d’écran, l’utilisateur a tapé un nouveau texte dans le contrôle d’édition de la zone de liste déroulante. L’utilisateur peut également avoir sélectionné un élément existant. La zone de liste se développe pour prendre en charge autant d’éléments que possible.
Dans la troisième capture d’écran, l’utilisateur a ouvert la zone de liste déroulante. La zone de liste se développe pour prendre en charge autant d’éléments que possible. L’utilisateur ne peut pas entrer de nouveau texte.
Il existe également un certain nombre de styles de zone de liste modifiable qui définissent des propriétés spécifiques. Les styles de zone de liste déroulante définissent des propriétés spécifiques d’une zone de liste modifiable. Vous pouvez combiner des styles ; toutefois, certains styles s’appliquent uniquement à certains types de zones de liste déroulante. Pour obtenir un tableau des styles de zone de liste déroulante, consultez Styles de zone de liste déroulante.
Notes
Pour utiliser des styles visuels avec des zones de liste déroulante, une application doit inclure un manifeste et doit 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.
Liste de zones de liste déroulante
La liste est la partie d’une zone de liste déroulante qui affiche les éléments qu’un utilisateur peut sélectionner. En règle générale, une application initialise le contenu de la liste lorsqu’elle crée une zone de liste modifiable. Tout élément de liste sélectionné par l’utilisateur est la sélection actuelle. Impossible de sélectionner plusieurs éléments. Dans les zones de liste déroulante simples, l’utilisateur peut taper le champ de sélection au lieu de sélectionner un élément de liste. Dans ce cas, il n’y a pas de sélection actuelle et il incombe à l’application d’ajouter l’élément à la liste et d’en faire la sélection actuelle, s’il est approprié de le faire.
Cette section traite des rubriques suivantes :
Sélection actuelle
La sélection actuelle est un élément de liste que l’utilisateur a sélectionné ; le texte sélectionné s’affiche dans le champ de sélection de la zone de liste déroulante. Toutefois, dans le cas d’une zone de liste modifiable simple ou d’une zone de liste déroulante, la sélection actuelle n’est qu’une seule forme d’entrée utilisateur possible dans une zone de liste déroulante. L’utilisateur peut également taper du texte dans le champ de sélection.
La sélection actuelle est identifiée par l’index de base zéro de l’élément de liste sélectionné. Une application peut le définir et le récupérer à tout moment. La fenêtre parente ou la procédure de boîte de dialogue reçoit une notification lorsque l’utilisateur modifie la sélection actuelle d’une zone de liste déroulante. La fenêtre parente ou la boîte de dialogue n’est pas avertie lorsque l’application modifie la sélection.
Lorsqu’une zone de liste modifiable est créée, il n’existe aucune sélection actuelle. Cela est également vrai pour une zone de liste déroulante simple ou déroulante, si l’utilisateur a modifié le contenu du champ de sélection. Pour définir la sélection actuelle, une application envoie le message CB_SETCURSEL à la zone de liste déroulante. Une application peut également utiliser le message CB_SELECTSTRING pour définir la sélection active sur un élément de liste dont la chaîne commence par une chaîne spécifiée. Pour déterminer la sélection actuelle, une application envoie le message CB_GETCURSEL à la zone de liste déroulante. S’il n’y a pas de sélection actuelle, ce message retourne CB_ERR.
Lorsque l’utilisateur modifie la sélection actuelle dans une zone de liste déroulante, la fenêtre parente ou la procédure de boîte de dialogue reçoit un message WM_COMMAND avec le code de notification CBN_SELCHANGE dans le mot d’ordre élevé du paramètre wParam . Ce code de notification n’est pas envoyé lorsque la sélection actuelle est définie à l’aide du message CB_SETCURSEL .
Une zone de liste déroulante ou une zone de liste déroulante envoie le code de notification CBN_CLOSEUP à la fenêtre parente ou à la procédure de boîte de dialogue lorsque la liste déroulante se ferme. Si l’utilisateur a modifié la sélection actuelle, la zone de liste déroulante envoie également le code de notification CBN_SELCHANGE lorsque la liste déroulante se ferme. Pour exécuter un processus spécifique chaque fois que l’utilisateur sélectionne un élément de liste, vous pouvez gérer le code de notification CBN_SELCHANGE ou CBN_CLOSEUP. En règle générale, vous attendez le code de notification CBN_CLOSEUP avant de traiter une modification de la sélection actuelle. Cela peut être particulièrement important si une quantité importante de traitement est nécessaire.
Une application peut également traiter les codes de notification CBN_SELENDOK et CBN_SELENDCANCEL . Le système envoie CBN_SELENDOK lorsque l’utilisateur sélectionne un élément de liste ou sélectionne un élément, puis ferme la liste. Cela indique que l’utilisateur a terminé et que la sélection doit être traitée. CBN_SELENDCANCEL est envoyé lorsque l’utilisateur sélectionne un élément, puis sélectionne un autre contrôle, appuie sur Échap pendant que la liste déroulante est ouverte ou ferme la boîte de dialogue. Cela indique que la sélection de l’utilisateur doit être ignorée. CBN_SELENDOK est envoyé avant chaque message CBN_SELCHANGE .
Dans une zone de liste modifiable simple, le système envoie le code de notification CBN_DBLCLK lorsque l’utilisateur double-clique sur un élément de liste. Dans une zone de liste déroulante ou une liste déroulante, un simple clic masque la liste. Il n’est donc pas possible de double-cliquer sur un élément.
Listes déroulantes
Certaines notifications et messages s’appliquent uniquement aux zones de liste déroulante contenant des listes déroulantes. Lorsqu’une liste déroulante est ouverte ou fermée, la fenêtre parente d’une zone de liste déroulante reçoit une notification sous la forme d’un message WM_COMMAND . Si la liste est ouverte, le mot d’ordre supérieur de wParam est CBN_DROPDOWN. Si la liste est fermée, elle est CBN_CLOSEUP.
Une application peut ouvrir la liste d’une zone de liste déroulante ou d’une zone de liste déroulante à l’aide du message CB_SHOWDROPDOWN . Il peut déterminer si la liste est ouverte à l’aide du message CB_GETDROPPEDSTATE et peut déterminer les coordonnées d’une liste déroulante à l’aide du message CB_GETDROPPEDCONTROLRECT . Une application peut également augmenter la largeur d’une liste déroulante à l’aide du message CB_SETDROPPEDWIDTH .
Lister le contenu
Lorsqu’une application crée une zone de liste déroulante, elle initialise généralement la zone de liste déroulante en ajoutant un ou plusieurs éléments à la liste. Plus tard, une application peut ajouter ou supprimer des éléments de liste, réinitialiser la liste ou récupérer des informations d’élément à partir de celle-ci.
Une application ajoute des éléments de liste à une zone de liste modifiable en lui envoyant le message CB_ADDSTRING . L’élément spécifié est ajouté à la fin de la liste ou, dans une zone de liste modifiable triée, à sa position triée correcte en fonction de la chaîne de l’élément. Dans une zone de liste déroulante non triée, une application peut utiliser le message CB_INSERTSTRING pour insérer un élément à une position spécifique. Une fois ajouté, un élément de liste est identifié par sa position.
En utilisant le message CB_FINDSTRING ou CB_FINDSTRINGEXACT , une application peut déterminer la position d’un élément de liste. CB_FINDSTRING recherche un élément dont la chaîne commence par la chaîne spécifiée. CB_FINDSTRINGEXACT trouve un élément dont la chaîne correspond exactement à la chaîne. Aucun des messages ne respecte la casse.
Une application peut supprimer un élément de liste à l’aide du message CB_DELETESTRING . Si une application doit réinitialiser la liste des zones de liste déroulante, elle peut d’abord effacer tout son contenu à l’aide du message CB_RESETCONTENT . Lors de l’ajout de plusieurs éléments à la liste une fois qu’une zone de liste modifiable a déjà été affichée, une application peut effacer l’indicateur de redessination pour empêcher la nouvelle peinture de la zone de liste modifiable après l’ajout de chaque élément. Pour plus d’informations sur le redessinage, consultez la description du message WM_SETREDRAW .
Pour récupérer la chaîne associée à un élément de liste, une application peut utiliser le message CB_GETLBTEXT . La chaîne de l’élément est copiée dans la mémoire tampon spécifiée par l’application. Pour s’assurer que la mémoire tampon est suffisamment grande pour recevoir la chaîne, l’application peut d’abord utiliser le message CB_GETLBTEXTLEN pour déterminer la longueur de la chaîne. Pour obtenir le nombre d’éléments de liste dans une zone de liste modifiable, une application peut utiliser le message CB_GETCOUNT .
Modifier les champs de sélection de contrôle
Une application peut récupérer ou définir le contenu du champ de sélection et peut déterminer ou définir la sélection de modification. L’application peut également limiter la quantité de texte qu’un utilisateur peut taper dans le champ de sélection. Lorsque le contenu du champ de sélection change, le système envoie des messages de notification à la fenêtre parente ou à la procédure de boîte de dialogue.
Pour récupérer le contenu du champ de sélection, une application peut envoyer le message WM_GETTEXT à la zone de liste déroulante. Pour définir le contenu du champ de sélection d’une zone de liste déroulante simple ou déroulante, une application peut envoyer le message WM_SETTEXT à la zone de liste déroulante.
La sélection de modification est la plage de texte sélectionné, le cas échéant, dans le champ de sélection d’une zone de liste déroulante simple ou déroulante. Une application peut déterminer les positions des caractères de début et de fin de la sélection actuelle à l’aide du message CB_GETEDITSEL . Il peut également sélectionner des caractères dans la sélection de modification à l’aide du message CB_SETEDITSEL .
Initialement, la quantité de texte que l’utilisateur peut taper dans le champ de sélection est limitée par la taille du champ de sélection. Toutefois, si la zone de liste déroulante a le style CBS_AUTOHSCROLL , le texte peut continuer au-delà de la taille du champ de sélection. Une application peut utiliser le message CB_LIMITTEXT pour limiter la quantité de texte qu’un utilisateur peut taper dans le champ de sélection, que le contrôle ait ou non le style CBS_AUTOHSCROLL .
Lorsque l’utilisateur modifie le contenu du champ de sélection, la fenêtre parente ou la procédure de boîte de dialogue reçoit des messages de notification. Le code de notification CBN_EDITUPDATE est envoyé en premier, indiquant que le texte du champ de sélection a été modifié. Une fois le texte modifié affiché, le système envoie CBN_EDITCHANGE. Lorsque le contenu du champ de sélection change à la suite de la sélection d’un élément de liste, ces messages ne sont pas envoyés.
Owner-Drawn zones de liste déroulante
Une application peut créer une zone de liste déroulante dessinée par le propriétaire pour assumer la responsabilité de la peinture des éléments de liste. La fenêtre parente d’une zone de liste déroulante dessinée par le propriétaire (son propriétaire) reçoit des messages WM_DRAWITEM lorsqu’une partie de la zone de liste modifiable doit être peinte. Une zone de liste déroulante dessinée par le propriétaire peut répertorier des informations autres que, ou en plus des chaînes de texte. Les zones de liste déroulante dessinées par le propriétaire peuvent être de n’importe quel type. Toutefois, le contrôle d’édition dans une zone de liste déroulante simple ou déroulante peut uniquement afficher du texte, tandis que le propriétaire peint le champ de sélection dans une zone de liste déroulante.
Le propriétaire d’une zone de liste déroulante 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 modifiable 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 déroulante.
Une application peut créer une zone de liste déroulante dessinée par le propriétaire en spécifiant le style CBS_OWNERDRAWFIXED ou CBS_OWNERDRAWVARIABLE . Si tous les éléments de liste de la zone de liste déroulante ont la même hauteur, tels que des chaînes ou des icônes, une application peut utiliser le style CBS_OWNERDRAWFIXED . Si les éléments de liste ont une hauteur variable, comme des bitmaps de taille différente, une application peut utiliser le style CBS_OWNERDRAWVARIABLE .
Le propriétaire d’une zone de liste déroulante dessinée par le propriétaire peut traiter un message WM_MEASUREITEM pour spécifier les dimensions des éléments de liste dans la zone de liste modifiable. Si l’application crée la zone de liste déroulante à l’aide du style CBS_OWNERDRAWFIXED , le système envoie le message WM_MEASUREITEM 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 CBS_OWNERDRAWVARIABLE est utilisé, le système envoie un message WM_MEASUREITEM pour chaque élément de liste ajouté à la zone de liste déroulante. Le propriétaire peut déterminer ou définir la hauteur d’un élément de liste à tout moment à l’aide des messages CB_GETITEMHEIGHT et CB_SETITEMHEIGHT , respectivement.
Si les informations affichées dans une zone de liste déroulante dessinée par le propriétaire incluent du texte, une application peut effectuer le suivi du texte pour chaque élément de liste en spécifiant le style CBS_HASSTRINGS . Les zones de liste déroulante avec le style CBS_SORT sont triées en fonction de ce texte. Si une zone de liste modifiable est triée et non du style CBS_HASSTRINGS , le propriétaire doit traiter le message WM_COMPAREITEM .
Dans une zone de liste déroulante dessinée par le propriétaire, le propriétaire doit effectuer le suivi des éléments de liste contenant des informations autres que ou en plus du texte. Une façon pratique de procéder consiste à enregistrer le handle dans les informations en tant que données d’élément. Pour libérer des objets de données associés aux éléments d’une zone de liste modifiable, le propriétaire peut traiter le message WM_DELETEITEM .
Zones de liste modifiables sous-classifiées
La sous-classe est une procédure qui permet à une application d’intercepter et de traiter les messages envoyés ou publiés dans une fenêtre. En utilisant la sous-classe, une application peut remplacer son propre traitement par certains messages, tout en laissant la plupart du traitement des messages à la procédure de fenêtre définie par la classe.
Lorsque le système d’exploitation crée une fenêtre, il enregistre des informations sur celle-ci dans une structure de données interne qui inclut un pointeur vers la procédure de fenêtre. Pour sous-classer une fenêtre, une application appelle la fonction SetClassLong pour remplacer le pointeur vers cette procédure par un pointeur vers une procédure de sous-classe définie par l’application. Par la suite, tous les messages envoyés à la fenêtre sont envoyés à la procédure de sous-classe. Cette procédure utilise ensuite la fonction CallWindowProc pour passer des messages non traités à la procédure de fenêtre d’origine. Pour obtenir une description du traitement des messages effectué par la procédure de fenêtre de classe COMBOBOX, consultez Comportement de la zone de liste modifiable par défaut.
Lorsque la zone de liste modifiable se trouve en dehors d’une boîte de dialogue, une application ne peut pas traiter les touches TAB, ENTRÉE et Échap, sauf si elle utilise une procédure de sous-classe. Lorsqu’une zone de liste déroulante simple ou déroulante reçoit le focus d’entrée, elle définit immédiatement le focus sur son contrôle d’édition enfant. Par conséquent, une application doit sous-classer le contrôle d’édition pour intercepter l’entrée du clavier pour une zone de liste déroulante simple ou déroulante. Pour obtenir un exemple de ceci, consultez Sous-classification d’une zone de liste modifiable.
Si une procédure de sous-classe traite le message WM_PAINT , elle doit utiliser la fonction BeginPaint pour préparer la peinture. Avant d’appeler la fonction EndPaint , elle transmet le handle de contexte d’appareil (DC) comme paramètre wParam pour la procédure de fenêtre. Si EndPaint est appelé en premier, la procédure de fenêtre de classe n’effectue aucune peinture, car EndPaint valide la fenêtre entière.
Une technique liée à la sous-classification est la superclassement. Une superclasse ressemble à une autre classe, sauf que sa procédure de fenêtre n’appelle pas DefWindowProc pour gérer les messages non traités. Au lieu de cela, il transmet les messages non traités à la procédure de fenêtre pour la classe de fenêtre parente. Suivez les instructions décrites dans Procédures de fenêtre pour éviter les problèmes qui peuvent se produire avec la sous-classification et la superclasse.