À propos des contrôles tabulation

Un contrôle tab équivaut aux intercalaires dans un classeur ou aux étiquettes dans une armoire de classement. En utilisant un contrôle tab, une application peut définir plusieurs pages pour la même zone d’une fenêtre ou d’une boîte de dialogue. Chaque page se compose d’un certain type d’informations ou d’un groupe de contrôles que l’application affiche lorsque l’utilisateur sélectionne l’onglet correspondant.

La capture d’écran suivante montre un contrôle onglet simple qui contient des onglets pour les jours de la semaine. L’onglet Mardi a été sélectionné.

screen shot of a property sheet with five tabs, one for each day of the week

Cette rubrique comprend les sections suivantes.

Création de contrôles tabulation

Vous pouvez créer un contrôle tabulation en appelant la fonction CreateWindowEx , en spécifiant la classe de fenêtre WC_TABCONTROL . Cette classe de fenêtre est inscrite lorsque la DLL de contrôles courants est chargée. Pour vous assurer que la DLL est chargée, utilisez la fonction InitCommonControlsEx .

Dans Microsoft Visual Studio, vous pouvez créer un contrôle onglet à l’aide de la boîte à outils.

Vous envoyez des messages à un contrôle Tab pour ajouter des onglets et affecter l’apparence et le comportement du contrôle. Chaque message a une macro correspondante que vous pouvez utiliser au lieu d’envoyer explicitement le message. Vous ne pouvez pas désactiver un onglet individuel dans un contrôle onglet. Toutefois, vous pouvez désactiver un contrôle tabulation dans une feuille de propriétés en désactivant la page correspondante.

Styles de contrôle tabulation

Vous pouvez appliquer certaines caractéristiques aux contrôles tabulation en spécifiant les styles de contrôle tabulation lors de la création du contrôle. Par exemple, vous pouvez spécifier l’alignement et l’apparence générale des onglets dans un contrôle onglet.

Vous pouvez faire en sorte que les onglets ressemblent à des boutons en spécifiant le style TCS_BUTTONS . Les onglets de ce type de contrôle tabulation doivent servir la même fonction que les contrôles de bouton ; autrement dit, cliquer sur un onglet doit exécuter une commande au lieu d’afficher une page. Étant donné que la zone d’affichage d’un contrôle d’onglet de bouton n’est généralement pas utilisée, aucune bordure n’est dessinée autour de celle-ci.

Vous pouvez faire en sorte qu’un onglet reçoive le focus d’entrée lorsque vous cliquez dessus en spécifiant le style TCS_FOCUSONBUTTONDOWN . Ce style est généralement utilisé uniquement avec le style TCS_BUTTONS . Vous pouvez spécifier qu’un onglet ne reçoit pas le focus d’entrée lorsque vous cliquez sur le style TCS_FOCUSNEVER .

Par défaut, un contrôle tabulation affiche une seule ligne d’onglets. Si tous les onglets ne peuvent pas être affichés en même temps, le contrôle onglet affiche un contrôle haut vers le bas afin que l’utilisateur puisse faire défiler des onglets supplémentaires dans l’affichage. Vous pouvez faire en sorte qu’un contrôle tabulation affiche plusieurs lignes d’onglets, si nécessaire, en spécifiant le style TCS_MULTILINE . Avec ce style, tous les onglets peuvent être affichés simultanément. Les onglets sont alignés à gauche dans chaque ligne, sauf si vous spécifiez le style TCS_RIGHTJUSTIFY . Dans ce cas, la largeur de chaque onglet est augmentée afin que chaque ligne d’onglets remplisse toute la largeur du contrôle tabulation.

Un contrôle tabulation dimensionne automatiquement chaque onglet pour qu’il corresponde à son icône, le cas échéant, et son étiquette. Pour donner à tous les onglets la même largeur, vous pouvez spécifier le style TCS_FIXEDWIDTH . Le contrôle dimensionne tous les onglets pour s’adapter à l’étiquette la plus large, ou vous pouvez affecter une largeur et une hauteur spécifiques à l’aide du message TCM_SETITEMSIZE . Dans chaque onglet, le contrôle centre l’icône et l’étiquette, en plaçant l’icône à gauche de l’étiquette. Vous pouvez forcer l’icône à gauche, en laissant l’étiquette centrée, en spécifiant le style TCS_FORCEICONLEFT . Vous pouvez aligner à gauche l’icône et l’étiquette à l’aide du style TCS_FORCELABELLEFT . Vous ne pouvez pas utiliser le style TCS_FIXEDWIDTH avec le style TCS_RIGHTJUSTIFY .

Vous pouvez spécifier que la fenêtre parente dessine les onglets du contrôle à l’aide du style TCS_OWNERDRAWFIXED . Pour plus d’informations, consultez Onglets dessinés par le propriétaire.

Vous pouvez spécifier qu’un contrôle Tab crée un contrôle d’info-bulle à l’aide du style TCS_TOOLTIPS . Pour plus d’informations à ce sujet, consultez info-bulles de contrôle tabulation.

Onglets et attributs d’onglet

Chaque onglet d’un contrôle onglet se compose d’une icône, d’une étiquette et de données définies par l’application. Ces informations sont spécifiées par une structure TCITEM . Vous pouvez ajouter des onglets à un contrôle tabulation, récupérer le nombre d’onglets, récupérer et définir le contenu d’un onglet et supprimer des onglets. Les onglets sont identifiés par leur index de base zéro.

Pour ajouter des onglets à un contrôle tabulation, utilisez le message TCM_INSERTITEM , en spécifiant la position de l’élément et l’adresse d’une structure TCITEM . Vous pouvez récupérer et définir le contenu d’un onglet existant à l’aide des messages TCM_GETITEM et TCM_SETITEM . Pour chaque onglet, vous pouvez spécifier une icône, une étiquette ou les deux. Vous pouvez également spécifier des données définies par l’application à associer à l’onglet.

Vous pouvez récupérer le nombre actuel d’onglets à l’aide du message TCM_GETITEMCOUNT , supprimer un onglet à l’aide du message TCM_DELETEITEM et supprimer tous les onglets d’un contrôle onglet à l’aide du message TCM_DELETEALLITEMS .

Vous pouvez associer des données définies par l’application à chaque onglet. Par exemple, vous pouvez enregistrer des informations sur chaque page avec son onglet correspondant. Par défaut, un contrôle tabulation alloue quatre octets supplémentaires par onglet pour les données définies par l’application. Vous pouvez modifier le nombre d’octets supplémentaires par onglet à l’aide du message TCM_SETITEMEXTRA . Vous ne pouvez utiliser ce message que lorsque le contrôle Tab est vide.

Les données définies par l’application sont spécifiées par le membre lParam de la structure TCITEM . Si vous utilisez plus de 4 octets de données définies par l’application, vous devez définir votre propre structure et l’utiliser au lieu de TCITEM. Vous pouvez récupérer et définir des données définies par l’application de la même façon que vous récupérez et définissez d’autres informations sur un onglet en utilisant les messages TCM_GETITEM et TCM_SETITEM .

Le premier membre de votre structure doit être une structure TCITEMHEADER , et les membres restants doivent spécifier des données définies par l’application. TCITEMHEADER est identique à TCITEM, sauf qu’il n’a pas le membre lParam . La différence entre la taille de votre structure et la taille de TCITEMHEADER doit être égale au nombre d’octets supplémentaires par onglet.

Zone d’affichage

La zone d’affichage d’un contrôle Onglet est la zone dans laquelle une application affiche la page active. En règle générale, une application crée une fenêtre enfant ou une boîte de dialogue, en définissant la taille et la position de la fenêtre pour qu’elle corresponde à la zone d’affichage. Étant donné le rectangle de fenêtre d’un contrôle tabulation, vous pouvez calculer le rectangle englobant de la zone d’affichage à l’aide du message TCM_ADJUSTRECT .

Parfois, la zone d’affichage doit être d’une taille particulière, par exemple la taille d’une boîte de dialogue enfant sans mode. Étant donné le rectangle englobant de la zone d’affichage, vous pouvez utiliser TCM_ADJUSTRECT pour calculer le rectangle de fenêtre correspondant pour le contrôle tabulation.

Sélection de l’onglet

Lorsque l’utilisateur sélectionne un onglet, un contrôle onglet envoie ses codes de notification de fenêtre parent sous la forme de messages WM_NOTIFY . Le code de notification TCN_SELCHANGING est envoyé avant les modifications de sélection et le code de notification TCN_SELCHANGE est envoyé après les modifications de sélection.

Vous pouvez traiter TCN_SELCHANGING pour enregistrer l’état de la page sortante. Vous pouvez retourner TRUE pour empêcher la sélection de changer. Par exemple, vous ne souhaiterez peut-être pas vous éloigner d’une boîte de dialogue enfant dans laquelle un contrôle a un paramètre non valide.

Vous devez traiter TCN_SELCHANGE pour afficher la page entrante dans la zone d’affichage. Cela peut simplement entraîner la modification des informations affichées dans une fenêtre enfant. Plus souvent, chaque page se compose d’une fenêtre enfant ou d’une boîte de dialogue. Dans ce cas, une application peut traiter cette notification en détruisant ou masquant la fenêtre ou la boîte de dialogue enfant sortante et en créant ou en affichant la fenêtre enfant entrante ou la boîte de dialogue.

Vous pouvez récupérer et définir la sélection actuelle à l’aide des messages TCM_GETCURSEL et TCM_SETCURSEL .

Listes d’images de contrôle tabulation

Chaque onglet peut avoir une icône associée, qui est spécifiée par un index dans la liste d’images pour le contrôle tabulation. Lorsqu’un contrôle tabulation est créé, il n’a aucune liste d’images associée. Une application peut créer une liste d’images à l’aide de la fonction ImageList_Create , puis l’affecter à un contrôle tabulation à l’aide du message TCM_SETIMAGELIST .

Vous pouvez ajouter des images à la liste d’images d’un contrôle Tab comme vous le feriez pour n’importe quelle autre liste d’images. Toutefois, une application doit supprimer des images à l’aide du message TCM_REMOVEIMAGE au lieu de la fonction ImageList_Remove . Ce message garantit que chaque onglet reste associé à la même image qu’auparavant.

La destruction d’un contrôle tabulation ne détruit pas une liste d’images associée. Vous devez détruire la liste d’images séparément. Cela est utile si vous souhaitez affecter la même liste d’images à plusieurs contrôles d’onglet.

Pour récupérer le handle dans la liste d’images actuellement associée à un contrôle tabulation, vous pouvez utiliser le message TCM_GETIMAGELIST .

Taille et position des onglets

Chaque onglet d’un contrôle onglet a une taille et une position. Vous pouvez définir la taille des onglets, récupérer le rectangle englobant d’un onglet ou déterminer l’onglet situé à une position spécifiée.

Pour les contrôles tabulation à largeur fixe et dessiné par le propriétaire, vous pouvez définir la largeur et la hauteur exactes des onglets à l’aide du message TCM_SETITEMSIZE . Dans d’autres contrôles d’onglet, la taille de chaque onglet est calculée en fonction de l’icône et de l’étiquette de l’onglet. Le contrôle tabulation inclut de l’espace pour une bordure et une marge supplémentaire. Vous pouvez définir l’épaisseur de la marge à l’aide du message TCM_SETPADDING .

Vous pouvez déterminer le rectangle englobant actuel d’un onglet à l’aide du message TCM_GETITEMRECT . Vous pouvez déterminer l’onglet, le cas échéant, à un emplacement spécifié à l’aide du message TCM_HITTEST .

Dans un contrôle tabulation avec le style TCS_MULTILINE , vous pouvez déterminer le nombre actuel de lignes d’onglets à l’aide du message TCM_GETROWCOUNT .

Onglets Owner-Drawn

Si un contrôle tabulation a le style TCS_OWNERDRAWFIXED , la fenêtre parente doit peindre des onglets en traitant le message WM_DRAWITEM . Le contrôle Tab envoie ce message chaque fois qu’un onglet doit être peint. Le paramètre lParam spécifie l’adresse d’une structure DRAWITEMSTRUCT , qui contient l’index de l’onglet, son rectangle englobant et le contexte de périphérique (DC) dans lequel dessiner.

Par défaut, le membre itemData de DRAWITEMSTRUCT contient la valeur du membre lParam de la structure TCITEM . Toutefois, si vous modifiez la quantité de données définies par application par onglet, itemData contient l’adresse des données à la place. Vous pouvez modifier la quantité de données définies par application par onglet à l’aide du message TCM_SETITEMEXTRA .

Pour spécifier la taille des éléments dans un contrôle onglet, la fenêtre parente doit traiter le message WM_MEASUREITEM . Étant donné que tous les onglets d’un contrôle onglet dessiné par le propriétaire sont de la même taille, ce message n’est envoyé qu’une seule fois. Il n’existe aucun style de contrôle tabulation pour les onglets dessinés par le propriétaire de différentes tailles. Vous pouvez également définir la largeur et la hauteur des onglets à l’aide du message TCM_SETITEMSIZE .

Info-bulles de contrôle tabulation

Vous pouvez utiliser un contrôle d’info-bulle pour fournir une brève description de chaque onglet d’un contrôle onglet. Un contrôle Tab qui a le style TCS_TOOLTIPS crée un contrôle d’info-bulle lorsqu’il est créé et détruit le contrôle d’info-bulle lorsqu’il est détruit. Vous pouvez également créer un contrôle d’info-bulle et l’affecter à un contrôle tabulation.

Si vous utilisez un contrôle d’info-bulle avec un contrôle tabulation, la fenêtre parente doit traiter le code de notification TTN_GETDISPINFO pour fournir une description de chaque onglet à la demande.

Pour utiliser le même contrôle d’info-bulle avec plusieurs contrôles tabulation, créez le contrôle d’info-bulle vous-même et affectez-le au contrôle tabulation à l’aide du message TCM_SETTOOLTIPS . Vous pouvez récupérer le handle dans le contrôle d’info-bulle actuel d’un contrôle Tab à l’aide du message TCM_GETTOOLTIPS . Si vous créez votre propre contrôle d’info-bulle, vous ne devez pas utiliser le style TCS_TOOLTIPS .

Traitement des messages par défaut du contrôle tabulation

Cette section décrit le traitement des messages effectué par un contrôle tabulation. Les messages spécifiques aux contrôles onglet sont abordés dans d’autres sections de cette documentation.

Message Traitement effectué
WM_CAPTURECHANGED Ne fait rien si le contrôle Tab a libéré la capture de la souris elle-même. Si une autre fenêtre a capturé la souris et qu’un bouton est maintenu enfoncé, la commande relâche le bouton.
WM_CREATE Alloue et initialise une structure de données interne. Le contrôle crée un contrôle d’info-bulle si le style TCS_TOOLTIPS est spécifié.
WM_DESTROY Libère les ressources allouées pendant le traitement WM_CREATE .
WM_GETDLGCODE Retourne une combinaison des valeurs DLGC_WANTARROWS et DLGC_WANTCHARS.
WM_GETFONT Retourne le handle à la police utilisée pour les étiquettes.
WM_KEYDOWN Traite les touches de direction et modifie la sélection, le cas échéant.
WM_KILLFOCUS Invalide l’onglet qui a le focus afin qu’il soit repeint pour refléter un état non centré.
WM_LBUTTONDOWN Transfère le message au contrôle d’info-bulle, le cas échéant, et modifie la sélection si l’utilisateur clique sur un onglet. Si l’utilisateur clique sur un bouton, le contrôle redessine le bouton pour donner une apparence enfoncée et capture la souris. Si l’utilisateur clique sur un onglet ou un bouton et que le style TCS_FOCUSONBUTTONDOWN est spécifié, le contrôle définit le focus sur lui-même.
WM_LBUTTONUP Relâche la souris si un bouton a été appuyé. Si le curseur se trouve sur le bouton et est maintenu enfoncé, le contrôle modifie la sélection en conséquence et redessine le bouton.
WM_MOUSEMOVE Transfère le message au contrôle d’info-bulle, le cas échéant. Si le style TCS_BUTTONS est spécifié et que le bouton de la souris est maintenu enfoncé après avoir cliqué, le contrôle peut également redessiner le bouton affecté pour lui donner une apparence levée ou réveillée.
WM_NOTIFY Transfère les codes de notification envoyés par le contrôle d’info-bulle.
WM_PAINT Dessine une bordure autour de la zone d’affichage (sauf si le style TCS_BUTTONS est spécifié) et peint tous les onglets qui croisent le rectangle non valide. Pour chaque onglet, il dessine le corps de l’onglet (ou envoie un message WM_DRAWITEM à la fenêtre parente), puis dessine une bordure autour de l’onglet. Si le paramètre wParam n’est pas NULL, le contrôle suppose que la valeur est un HDC et peint à l’aide de ce contexte d’appareil.
WM_RBUTTONDOWN Envoie un code de notification NM_RCLICK à la fenêtre parente.
WM_SETFOCUS Invalide l’onglet qui a le focus afin qu’il soit repeint pour refléter un état prioritaire.
WM_SETFONT Définit la police utilisée pour les étiquettes.
WM_SETREDRAW Définit l’état d’un indicateur interne qui détermine si le contrôle est repeint lorsque les éléments sont insérés et supprimés, lorsque la police est modifiée, et ainsi de suite.
WM_SIZE Recalcule les positions des onglets et peut invalider une partie du contrôle tabulation pour forcer la réinitialisation de certains onglets ou de tous les onglets.