À propos des contrôles d’onglet

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 d’onglet simple qui contient des onglets pour les jours de la semaine. L’onglet Mardi a été sélectionné.

capture d’écran d’une feuille de propriétés avec cinq onglets, un pour chaque jour de la semaine

Cette rubrique comprend les sections suivantes.

Création de contrôles d’onglet

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 common controls 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 d’onglet 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 le message explicitement. Vous ne pouvez pas désactiver un onglet individuel dans un contrôle d’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 d’onglet en spécifiant des styles de contrôle d’onglet 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 d’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 d’onglet doivent servir la même fonction que les contrôles de bouton ; Autrement dit, le fait de 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 forcer un onglet à recevoir 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 lorsqu’il est cliqué à l’aide du style TCS_FOCUSNEVER .

Par défaut, un contrôle d’onglet n’affiche qu’une seule ligne d’onglets. Si tous les onglets ne peuvent pas être affichés en même temps, le contrôle d’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 d’onglet 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 à la fois. 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 remplit toute la largeur du contrôle d’onglet.

Un contrôle d’onglet dimensionne automatiquement chaque onglet en fonction de son icône, le cas échéant, et de 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 attribuer 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 tabulation 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 de tabulation.

Onglets et attributs d’onglet

Chaque onglet d’un contrôle d’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 d’onglet, 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 d’onglet, 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 les 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 d’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 d’onglet 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 d’onglet 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 à l’aide des messages TCM_GETITEM et TCM_SETITEM .

Le premier membre de votre structure doit être une structure TCITEMHEADER , et les autres membres 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 d’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 ou une boîte de dialogue enfant, en définissant la taille et la position de la fenêtre en fonction de la zone d’affichage. Étant donné le rectangle de fenêtre d’un contrôle d’onglet, vous pouvez calculer le rectangle englobant de la zone d’affichage à l’aide du message TCM_ADJUSTRECT .

Parfois, la zone d’affichage doit avoir 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 d’onglet envoie ses codes de notification de fenêtre parente sous la forme de messages WM_NOTIFY . Le code de notification TCN_SELCHANGING est envoyé avant la modification de la sélection, et le code de notification TCN_SELCHANGE est envoyé après la modification de la 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 passer 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 impliquer la modification des informations affichées dans une fenêtre enfant. Plus souvent, chaque page se compose d’une fenêtre ou d’une boîte de dialogue enfant. Dans ce cas, une application peut traiter cette notification en détruisant ou en masquant la boîte de dialogue ou la fenêtre enfant sortante et en créant ou en montrant la fenêtre ou la boîte de dialogue enfant entrante.

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

Tab Control Image Lists

Une icône peut être associée à chaque onglet, qui est spécifiée par un index dans la liste d’images du contrôle Tab. Lorsqu’un contrôle d’onglet est créé, aucune liste d’images n’est 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 d’onglet comme vous le feriez à 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 qui lui est 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 de la tabulation

Chaque onglet d’un contrôle d’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 celui qui se trouve à une position spécifiée.

Pour les contrôles d’onglets à largeur fixe et dessinés par le propriétaire, vous pouvez définir la largeur et la hauteur exactes des onglets à l’aide du message TCM_SETITEMSIZE . Dans les 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 comprend 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 quel onglet, le cas échéant, se trouve à un emplacement spécifié à l’aide du message TCM_HITTEST .

Dans un contrôle d’onglet 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 les 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 d’appareil (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 l’application par onglet, itemData contient plutôt l’adresse des données. Vous pouvez modifier la quantité de données définies par l’application par onglet à l’aide du message TCM_SETITEMEXTRA .

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

Info-bulles de contrôle d’onglet

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 d’onglet 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 Onglet.

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

Pour utiliser le même contrôle d’info-bulle avec plusieurs contrôles d’onglet, créez le contrôle d’info-bulle vous-même et affectez-le au contrôle d’onglet à 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 d’onglet à 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 de contrôle d’onglet par défaut

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

Message Traitement effectué
WM_CAPTURECHANGED Ne fait rien si le contrôle tabulation 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 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 WM_CREATE traitement.
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 un clic, le contrôle peut également redessiner le bouton affecté pour lui donner une apparence surélevée ou enfoncé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 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 des éléments sont insérés et supprimés, lorsque la police est modifiée, etc.
WM_SIZE Recalcule les positions des onglets et peut invalider une partie du contrôle d’onglet pour forcer le repeint de certains ou de tous les onglets.