| APPEARANCE BUTTON | commande |
Syntaxe : APPEARANCE BUTTON [#][-] id&[,[etat][,[valeur][,[min][,[max][,[titre$][,[rect][,[type]]]]]]]
Description : La commande APPEARANCE BUTTON installe un nouveau contrôle dans la fenêtre d’affichage courante, ou modifie les caractéristiques d’un contrôle existant. Après avoir créé un bouton à l’aide de la commande APPEARANCE BUTTON, vous pouvez utiliser la fonction DIALOG pour déterminer si l’utilisateur a cliqué dessus. Vous pouvez utiliser la commande BUTTON CLOSE si vous souhaitez supprimer un bouton sans fermer la fenêtre.
Lorsque vous créez un bouton avec un identifiant spécifique (dans une fenêtre donnée), vous devez spécifier tous les paramètres jusqu’à y compris le type. Si, ultérieurement, vous souhaitez modifier les caractéristiques du bouton, vous devez exécuter à nouveau la commande BUTTON avec le même identifiant, et spécifier un ou plusieurs paramètres (à l’exception du type qui ne peut pas être changé). Le bouton sera réaffiché avec les nouvelles caractéristiques que vous aurez spécifiées; les paramètres que vous aurez omis ne seront pas modifiés.
Note : A la création d’un bouton, les valeurs par défaut attribuées aux paramètres éventuellement manquants sont :
Vous pouvez masquer le contrôle avec l’une des commandes BUTTON -1 ou APPEARANCE BUTTON -1 et vous pouvez désactiver le contrôle avec soit BUTTON 1, _grayBtn ou APPEARANCE BUTTON 1, _grayBtn. Les panneaux utilisateurs sont masqués et révélés selon qu’ils doivent apparaître à l’écran ou non lorsque l’utilisateur interagit avec les onglets. Les boutons de groupe affectent aussi l’ensemble des boutons qu’ils fédèrent.
Pour lire la valeur d’un bouton de l’Appearance, utilisez soit x = BUTTON(id) ou x = BUTTON(id, _FBGetCtlRawValue) Résumé des commandes et fonctions du runtime Appearance : Les routines utilitaires suivantes vous aideront à accéder aux informations relatives aux contrôles du runtime Appearance :
tailleReelle = FN ButtonDataSize( btnID, part, tag )
DEF GETBUTTONDATA( btnID, part, tag, tailleMax, donnees, tailleReelle ) DEF SETBUTTONTEXTSTRING ( btnID, chaine$ ) chaine$ = FN ButtonTextString$( btnID ) DEF SETBUTTONFOCUS ( btnID ) DEF GETBUTTONTEXTSELECTION ( btnID, debutSel, finSel ) DEF SETBUTTONTEXTSELECTION ( btnID, debutSel, finSel ) Types de bouton : L’Appearance Manager (le Gestionnaire d’Apparence) a introduit de nombreuses définitions de contrôles. Bien que l’intention ici ne soit pas de documenter complètement tous les nouveaux boutons introduits par Apple, un grand nombre d’entre eux sont illustrés ci-après avec des exemples de code montrant comment les implémenter.
Boutons poussoirs : Du fait que l’Appearance Manager est disponible à la fois avec le Système 9 et OS X, vous constaterez des différences notoires dans la manière dont les contrôles sont affichés à l’écran. Les boutons poussoirs sont montrés ci-dessous dans les deux versions du système. .Boutons poussoirs avec OS X et le Système 9 Le code source qui suit a été utilisé pour générer l’affichage ci-dessus
/*
APPEARANCE BUTTON[#][-]id&[,[etat][,[valeur][,[min][,[max][,[titre$][,[rect][,[type]]]]]]] */ APPEARANCE BUTTON bRef,_activeBtn,0,0,1, "_kControlPushButtonProc",@r,_kControlPushButtonProc APPEARANCE BUTTON bRef,_activeBtn,0,0,1, ¬ "_kControlBevelButtonSmallBevelProc",@r,_kControlBevelButtonSmallBevelProc APPEARANCE BUTTON bRef,_activeBtn,0,0,1, ¬ "_kControlBevelButtonNormalBevelProc",@r,_kControlBevelButtonNormalBevelProc APPEARANCE BUTTON bRef,_activeBtn,0,0,1, ¬ "_kControlBevelButtonLargeBevelProc",@r,_kControlBevelButtonLargeBevelProc // le paramètre “valeur” est l’identifiant du menu APPEARANCE BUTTON bRef,_activeBtn,101,0,1, ¬ "Bevel + _kControlBevelButtonMenuOnRight",@r, ¬ _kControlBevelButtonSmallBevelProc + _kControlBevelButtonMenuOnRight // le paramètre “max” est l’identifiant de la ressource cicn APPEARANCE BUTTON bRef,_activeBtn,0,0,256, ¬ "_kControlPushButRightIconProc",@r,_kControlPushButRightIconProc APPEARANCE BUTTON bRef,_activeBtn,0,0,256, ¬ "_kControlPushButLeftIconProc",@r,_kControlPushButLeftIconProc // récupère le rectangle de l’image pour déterminer la taille du bouton h = FN GetPicture(256) LONG IF h pR;8 = @h..picFrame% OffsetRect(pR,-pR.left,-pR.top) OffsetRect(pR,r.left,r.top) // la “valeur” du contrôle est l’identifiant de l’image PICT APPEARANCE BUTTON bRef,_activeBtn,256,0,1,"_kControlPictureProc",@pR,_kControlPictureProc END IF Tous les types de boutons (et leurs variations) ne sont pas montrés ici. Par exemple, le contrôle qui affiche une flèche indiquant la présence d’un menu a été construit avec un petit biseau. Il aurait pu être créé avec un biseau plus grand comme ceci :
_kControlBevelButtonLargeBevelProc + _kControlBevelButtonMenuOnRight Les autres types de boutons que vous pouvez explorer sont : _kControlIconProc
_kControlIconNoTrackProc _kControlIconSuiteProc _kControlIconSuiteNoTrackProc _kControlPictureNoTrackProc Utilisation des boutons pour grouper ou séparer : Avec l’Appearance Manager vous avez la possibilité de grouper des éléments, de les placer sur des “placards” (pancartes), ou de les séparer par des lignes de division. L’exemple suivant crée des boutons sur un fond blanc de manière à ce que vous puissiez voir plus facilement le dessin qui est effectué par la définition du contrôle. Nous commençons par le code source utilisé pour créer les boutons :
APPEARANCE BUTTON bRef, _activeBtn, 0, 0, 1, ¬
"_kControlGroupBoxTextTitleProc", @r, _kControlGroupBoxTextTitleProc APPEARANCE BUTTON bRef, _activeBtn, 0, 0, 1, ¬ "_kControlGroupBoxSecondaryTextTitleProc", @r, _kControlGroupBoxSecondaryTextTitleProc APPEARANCE BUTTON bRef, _activeBtn, 1, 0, 1, ¬ "_kControlGroupBoxCheckBoxProc", @r, _kControlGroupBoxCheckBoxProc APPEARANCE BUTTON bRef, _activeBtn, 1, 0, 1,¬ "_kControlGroupBoxSecondaryCheckBoxProc", @r, _kControlGroupBoxSecondaryCheckBoxProc // le paramètre “min” est l’identifiant du menu APPEARANCE BUTTON bRef, _activeBtn, 1, 101, 1,"", @r, _kControlGroupBoxPopUpButtonProc APPEARANCE BUTTON bRef, _activeBtn, 1, 101, 1,"", @r, _kControlGroupBoxSecondaryPopUpButtonProc APPEARANCE BUTTON bRef, _activeBtn, 1, 0, 1,"", @r, _kControlPlacardProc APPEARANCE BUTTON bRef, _activeBtn, 1, 0, 1,"", @r, _kControlSeparatorLineProc
Imbrication de boutons :Une partie de la puissance des boutons de l’Appearance Manager tient au fait qu’un bouton peut être inclus dans un autre. En désactivant ou masquant le bouton parent (appelé super contrôle) on peut automatiquement activer ou masquer tous les boutons qu’il englobe. Chaque fenêtre possède un contrôle principal dit contrôle racine (root control). L’exemple qui suit construit une fenêtre avec un bouton groupe radio parent qui contiendra trois boutons radio. Nous pouvons déterminer lequel des trois boutons a été sélectionné en récupérant la valeur (via la fonction BUTTON) du bouton parent.
![]() DIM r AS RECT
DIM pR AS RECT DIM h AS HANDLE DIM bRef AS LONG DIM err AS OSErr // setup _btnHauteur = 20 _btnLargeur = 80 _btnMarge = 8 bRef = 1 // création d’une fenêtre SetRect(r,0,0,_btnLargeur_btnMarge_btnMarge,120) APPEARANCE WINDOW 1,,@r err = DEF SETWINDOWBACKGROUND( _kThemeActiveDialogBackgroundBrush, y ) // le button n°1 est le bouton père // notez que le bouton parent doit avoir une dimension // suffisante pour contenir les boutons inclus SetRect(r,_btnMarge,_btnMarge, _btnMarge_btnLargeur,(_btnMarge_btnHauteur)*3) APPEARANCE BUTTON bRef,_activeBtn,0,0,1,"",@r,_kControlRadioGroupProc bRef ++ SetRect(r,_btnMarge,_btnMarge,_btnMarge_btnLargeur, _btnMarge_btnHauteur) APPEARANCE BUTTON bRef,_activeBtn,0,0,1,"Radio 1",@r,_kControlRadioButtonProc DEF EMBEDBUTTON(bRef,1) bRef ++ : OffsetRect(r,0,_btnHauteur_btnMarge) APPEARANCE BUTTON bRef,_activeBtn,0,0,1,"Radio 2",@r,_kControlRadioButtonProc DEF EMBEDBUTTON(bRef,1) bRef ++ : OffsetRect(r,0,_btnHauteur_btnMarge) APPEARANCE BUTTON bRef,_activeBtn,0,0,1,"Radio 3",@r,_kControlRadioButtonProc DEF EMBEDBUTTON(bRef,1) LOCAL FN gererDialogue DIM AS LONG action,reference action = DIALOG(0) reference = DIALOG(action) LONG IF action = _btnclick MoveTo(8,100) PRINT "Bouton courant ";BUTTON(1); END IF END FN ON DIALOG FN gererDialogue DO HANDLEEVENTS UNTIL 0 Cases à cocher : En dehors de la différence évidente dans leur aspect physique avec l’Appearance Manager, les cases à cocher suivent les règles d’utilisation qu’elles ont toujours suivies. Toutefois, il y a une notable exception à cette règle avec la possibilité de leur donner une valeur “mixte”. Ce type de case contient un tiret au lieu d’une coche pour montrer qu’une partie, et non l’ensemble, des éléments appartenant à la sélection courante possède une caractéristique particulière. Ceci implique une nouvelle valeur maximale possible de 2 pour ce type de contrôle (_kControlCheckBoxMixedValue = 2). Voici les valeurs possibles d’une case à cocher : _kControlCheckBoxUncheckedValue
_kControlCheckBoxCheckedValue _kControlCheckBoxMixedValue Les boutons de la copie d’écran ci-dessus ont été créés avec les lignes de code suivantes :
APPEARANCE BUTTON bRef,_activeBtn, _kControlCheckBoxUncheckedValue,0,¬
_kControlCheckBoxMixedValue,"Case désélectionnée",@r,_kControlCheckBoxProc APPEARANCE BUTTON bRef,_activeBtn, _kControlCheckBoxMixedValue,0,¬ _kControlCheckBoxMixedValue,"Case à valeur mixte",@r,_kControlCheckBoxProc APPEARANCE BUTTON bRef,_activeBtn, _kControlCheckBoxCheckedValue,0,¬ _kControlCheckBoxMixedValue, "Case cochée",@r, _kControlCheckBoxProc Note : Vous ne pouvez pas utiliser la commande BUTTON bRef,etat pour modifier l’état des boutons dont le type est soit _kControlGroupBoxCheckBoxProc ou bien _kControlGroupBoxSecondaryCheckBoxProc. Utilisez APPEARANCE BUTTON bRef,,state-1 à la place. (BUTTON bRef,0 et BUTTON bRef,1 pourront cependant respectivement désactiver ou activer le bouton ).
Boutons heure et date : En plus des boutons traditionnels, l’Appearance Manager peut créer des boutons qui gèrent les dates et les heures. Des structures de données spécifiques sont maintenues pour accéder à l’information contenue dans ces contrôles. En examinant quelques exemples simples vous pourrez très vite les maîtriser. La fonction BUTTON améliorée vous sera utile pour extraire les données complexes des contrôles, et en particulier ici les deux instructions suivantes : ignore = BUTTON(btnRef,_FBGetControlDate)
ignore = BUTTON(btnRef,_FBGetControlTime) L’utilisation de l’une ou l’autre de ces syntaxes remplira un record global date/heure nommé gFBControlLongDate et un autre nommé gFBControlSeconds. gFBControlSeconds est une variable signée sur 64 bits qui peut être sauvegardée dans un fichier ou utilisée dans une variable qui nécessite un stockage compressé.
Le format de gFBControlLongDate est celui d’une structure LongDateRec qui se présente ainsi : BEGIN RECORD LongDateRec
DIM era AS SHORT DIM year AS SHORT DIM month AS SHORT DIM day AS SHORT DIM hour AS SHORT DIM minute AS SHORT DIM second AS SHORT DIM dayOfWeek AS SHORT DIM dayOfYear AS SHORT DIM weekOfYear AS SHORT DIM pm AS SHORT DIM res1 AS SHORT DIM res2 AS SHORT DIM res3 AS SHORT END RECORD Après avoir appelé la fonction BUTTON pour examiner le contenu d’un contrôle, vous pouvez extraire des portions d’informations de la structure date/heure comme suit :
jourDuMois = gFBControlLongDate.day
annee = gFBControlLongDate.year Une autre variable est maintenue pour contenir le texte spécifique d’un contrôle date/heure. Le contenu de gFBControlText (une chaîne Pascal) est déterminé par le second paramètre de la fonction BUTTON. Lorsque la constante _FBGetControlDate est utilisée, le contenu est une date. Lorsque la constante _FBGetControlTime est utilisée, le contenu est une heure.
Lorsque vous créez un contrôle Date/Heure en spécifiant un type particulier, vous devez aussi spécifier une valeur initiale au contrôle parmi les valeurs suivantes :
_kControlClockNoFlags
_kControlClockIsDisplayOnly _kControlClockIsLive Les instructions utilisées pour créer l’exemple ci-dessus sont les suivantes : APPEARANCE BUTTON bRef, _activeBtn, 0, 0, 1, , @r, _kControlClockTimeProc
APPEARANCE BUTTON bRef, _activeBtn,_kControlClockIsLive,0,1,,@r,_kControlClockTimeSecondsProc APPEARANCE BUTTON bRef, _activeBtn,_kControlClockNoFlags,0,1,,@r,_kControlClockDateProc APPEARANCE BUTTON bRef, _activeBtn,_kControlClockNoFlags,0,1,,@r,_kControlClockMonthYearProc APPEARANCE BUTTON bRef, _activeBtn, ¬ _kControlClockIsLive_kControlClockIsDisplayOnly,0,1,,@r,_kControlClockTimeSecondsProc Pour extraire et afficher le contenu d’un contrôle, les instructions suivantes peuvent être utilisées :
err = BUTTON(bRef,_FBgetControlTime)
EDIT FIELD bRef,gFBControlText,@r Etat d’attente :
Les barres de progression sont aussi facilement créées, mais vous devez vous rappeler un certain nombre de choses : en premier lieu, une barre de progression opère dans un intervalle allant de -32768 à +32767. Si votre tâche nécessite un plus grand nombre d’étapes, vous devrez calculer un quotient pour conserver les valeurs à l’intérieur de cet intervalle. Ensuite, votre programme doit se charger de mettre à jour la barre de progression. Ceci est aussi simple que d’assigner une nouvelle valeur à un bouton, mais c’est toutefois du code qu’il vous faudra écrire.
Les valeurs maximale et minimale du contrôle deviennent les valeurs maximale et minimale de la barre de progression. La valeur initiale ou la valeur courante indiquent le taux de progression. Dans l’exemple ci-dessus, le bouton a été créé à l’aide du code source suivant : APPEARANCE BUTTON bRef,_activeBtn,50,0,100,,@r,_kControlProgressBarProc
La valeur minimale était 0, et le maximum 100. Au moment de sa création, la valeur du contrôle était 50, si bien que le contrôle affiche une progression de 50%, à la moitié de la valeur maximale. Pour indiquer l’étape suivante dans la progression, nous pourrions écrire l’instruction ci-dessous :
APPEARANCE BUTTON bRef,,51
Les barres de progression à durée indéterminée sont plus complexes. Après la création d’un tel contrôle, vous devez assigner une nouvelle valeur à une donnée interne du contrôle. Le code source qui suit vous montre comment :
APPEARANCE BUTTON bRef,_activeBtn,1,0,1,,@r,_kControlProgressBarProc
DIM @ b AS BOOLEAN b = _True DEF SETBUTTONDATA (bRef, _kControlEntireControl,¬ _kControlProgressBarIndeterminateTag, SIZEOF(BOOLEAN), @b) Sélecteurs d’intervalle (glissières et flèches) :
Les glissières verticales sont créées en construisant un bouton dont la hauteur est plus grande que la largeur. L’orientation est gérée automatiquement par le système. Les lignes qui suivent montrent comment l’affichage ci-dessus a été créé : APPEARANCE BUTTON bRef, _activeBtn, 1, 1, 10, , @r, _kControlSliderProc
APPEARANCE BUTTON bRef, _activeBtn, 10, 1, 10, , @r, ¬ _kControlSliderProc_kControlSliderHasTickMarks APPEARANCE BUTTON bRef, _activeBtn, 1, 1, 10, , @r, ¬ _kControlSliderProc_kControlSliderNondirectional APPEARANCE BUTTON bRef, _activeBtn, 1, 1, 10, , @r, ¬ _kControlSliderProc_kcontrolSliderReverseDirection APPEARANCE BUTTON bRef, _activeBtn, 10, 1, 10, , @r, ¬ _kControlSliderProc_kControlSliderHasTickMarks + _kcontrolSliderReverseDirection // orientation verticale APPEARANCE BUTTON bRef, _activeBtn, 10, 1, 10, , @r, _kControlSliderProc APPEARANCE BUTTON bRef, _activeBtn, 10, 1, 10, , @r, ¬ _kControlSliderProc_kControlSliderNondirectional APPEARANCE BUTTON bRef, _activeBtn, 10, 1, 10, , @r, ¬ _kControlSliderProc_kControlSliderHasTickMarks_kcontrolSliderReverseDirection APPEARANCE BUTTON bRef, _activeBtn, 0, 0, 1, , @r, _kControlLittleArrowsProc Lorsque le bouton à glissière est créé, le nombre de marques de division est déterminé par la valeur initiale du contrôle. Après que le contrôle a été créé, sa valeur est réinitialisée à la valeur minimale assignée au contrôle. L’intervalle des valeurs possibles pour une glissière s’étend de -32768 à +32767. Il vous revient de déterminer le nombre de marques de division en tenant compte de la taille du contrôle et de l’intervalle de ses valeurs possibles (minimum/maximum).
Les petites flèches (montrées dans l’illustration ci-avant) sont utilisées pour incrémenter ou décrémenter une valeur généralement affichée dans un champ d’édition associé. La version actuelle de ce contrôle dans OS X ne permet pas de variations dans la hauteur du contrôle. La hauteur du contrôle doit être de 22 pixels exactement, toute autre valeur donne des résultats inattendus. Menus locaux : Il y a deux types de menus locaux distincts : bouton biseauté à menu local et menu local standard. L’utilisation de l’un ou l’autre de ces types de contrôle doit être guidée par les besoins de votre application et les règles concernant l’interface utilisateur édictées par Apple (Human Interface Guide Lines). Les boutons biseautés sont créés comme suit : APPEARANCE BUTTON bRef, _activeBtn, menuID, 0, 1,Bevel+_kControlBevelButtonMenuOnRight",¬
@r, _kControlBevelButtonSmallBevelProc + _kControlBevelButtonMenuOnRight Lorsqu’un bouton biseauté à menu local est créé, la valeur initiale du contrôle correspond au numéro identifiant de la ressource de menu associée. Pour extraire l’information d’un tel contrôle, trois instructions spécifiques peuvent être utilisées avec la fonction BUTTON :
menuHandle = BUTTON(bRef, _FBgetBevelControlMenuHandle)
acticleActuel = BUTTON(bRef, _FBgetBevelControlMenuVal) menuPrecedent = BUTTON(bRef, _FBgetBevelControlLastMenu) ![]() Boutons à menu local :
Les menus locaux standards suivent une syntaxe légèrement différente. La valeur minimale devient l’identifiant de la ressource de menu associée. La valeur maximale représente la largeur assignée au titre du menu. Si vous passez -12345 comme identifiant de menu aucune ressource ne sera recherchée pour l’associer au contrôle, vous pourrez alors construire le menu et assigner ultérieurement son handle à la structure interne du contrôle avec une instruction du type suivant : DEF SETBUTTONDATA(id&, _kControlMenuPart, _kControlPopupButtonMenuHandleTag, ¬
SIZEOF(HANDLE), @votreMenuHndl ) Vous pouvez également passer -1 comme valeur maximale du contrôle, la largeur du titre de menu sera alors calculée automatiquement pour vous. Si vous passez zéro comme valeur maximale, le titre du menu ne sera pas affiché. Après la création du contrôle, vous pouvez assigner ses valeurs courantes, minimale et maximale pour attibuer la largeur correcte au menu.
APPEARANCE BUTTON id&,,valeur,mini,maxi
Le bouton menu local de l’illustration ci-dessus a été créé avec le code suivant :
APPEARANCE BUTTON bRef,_activeBtn,0,101,-1,"Titre du menu:",@r,_kControlPopUpButtonProc
La fonction BUTTON vous permet de retrouver le handle pointant sur le menu associé. Rappelez-vous que les boutons menus locaux standards et les boutons biseautés nécessitent des constantes différentes pour accéder à cette information.
menuHandle = BUTTON(bRef, _FBgetControlMenuHandle)
L’article courant peut être retrouvé de la manière suivante :
articleCourant = BUTTON(bRef)
Listes : Généralement, les listes utilisent une ressource auxilliaire qui définit leur format. Cette ressource possède le type "ldes". Vous pouvez créer une telle ressource à l’aide de Resorcerer 2.4 ou une version ultérieure ou bien en créant le modèle adéquat avec tout autre éditeur de ressources. Vous pouvez également formater un handle de telle sorte qu’il corresponde à une structure "ldes" et le sauvegarder en tant que ressource. Le numéro identifiant de ressource doit être passé dans le paramètre valeur lorsque le contrôle est créé. Vous pouvez aussi passer zéro comme valeur, auquel cas l’Appearance Manager ne recherchera pas de ressource pour construire le contrôle liste. La liste sera créée avec des valeurs par défaut et utilisera la définition standard LDEF (0). Vous pouvez modifier la liste en récupérant son handle. Vous pouvez attribuer une définition de liste (LDEF) à l’aide de la constante _kControlListBoxLDEFTag en conjonction avec la commande DEF SETBUTTONDATA. Une ressource ldes est définie comme suit : BEGIN RECORD ldes
DIM versionNumber AS SHORT DIM numberOfRows AS SHORT DIM numberOfColumns AS SHORT DIM cellHeight AS SHORT DIM cellWidth AS SHORT DIM hasVertScroll AS BOOLEAN DIM filler1 AS BYTE DIM hasHorizScroll AS BOOLEAN DIM filler2 AS BYTE DIM LDEFresID AS SHORT DIM hasSizeBox AS BOOLEAN DIM reserved AS BYTE END RECORD
L’exemple qui suit, crée un contrôle liste à partir d’une ressource dont le numéro identifiant est 256, puis la liste est remplie avec des éléments textuels.
Pour simplifier cet exemple. Resorcerer a été utilisé pour créer la ressource ldes. ![]() Création d’une ressource ldes
APPEARANCE BUTTON bRef,_activeBtn,256,0,1,"List Box",@r,_kControlListBoxProc DIM cH AS HANDLE //handle sur le contrôle DIM @ taillebuffer AS LONG DIM @ lH AS HANDLE //handle sur la liste DIM y,t$ DIM @ celluleY,celluleX //cellule record "point" cH = BUTTON&(bRef) err = FN GetControlData( cH, 0, _kControlListBoxListHandleTag, ¬ SIZEOF(HANDLE), lH,taillebuffer ) celluleX = 0 FOR celluleY = 0 TO 9 t$ = "Item #" + MID$(STR$(celluleY+1),2) LSetCell(@t$[1], t$[0], celluleY, lH) NEXT Boutons à onglets : Les boutons à onglets nécessitent plus de travail que les autres contrôles. Cela tient au fait que ce type de bouton comprend en réalité plusieurs contrôles imbriqués qui doivent fonctionner harmonieusement. Il y a tout d’abord le contrôle principal. Lors de sa création, vous spécifiez le nombre d’onglets qu’il contient avec le paramètre représentant la valeur maximale. Généralement, il est préférable de créer ce contrôle dans un état invisible en spécifiant un numéro de référence négatif, vous pourrez ensuite l’afficher à l’aide de la commande BUTTON avec, cette fois-ci, un numéro de référence positif. Après la création du contrôle principal, vous devez attribuer un titre à chaque onglet à l’aide de la commande DEF SETBUTTONDATA. Puis, les panneaux utilisateurs (user panes) sont insérés. Ils sont imbriqués dans le contrôle principal avec la commande DEF EMBEDBUTTON. Les boutons qui résident dans un panneau spécifique doivent être créés et aussi imbriqués dans le panneau utilisateur auquel ils appartiennent. Lorsqu’un événement de dialogue est intercepté, la valeur du contrôle principal correspond au rang de l’onglet cliqué dans la liste des onglets. Votre programme doit passer en revue tous les panneaux imbriqués afin de les montrer ou les masquer de telle sorte que l’affichage corresponde à l’onglet qui aura été cliqué, c’est-à-dire au choix de l’utilisateur. Etudiez l’exemple qui suit pour voir comment on peut gérer un bouton à onglets. Examinez le gestionnaire de dialogue qui traite l’interaction de l’utilisateur avec les boutons. ![]() Il y a différents styles de boutons à onglets : _kControlTabLargeProc
_kControlTabSmallProc _kControlTabLargeNorthProc _kControlTabSmallNorthProc _kControlTabLargeSouthProc _kControlTabSmallSouthProc _kControlTabLargeEastProc _kControlTabSmallEastProc _kControlTabLargeWestProc _kControlTabSmallWestProc Cet exemple utilise _kControlTabSmallProc, mais vous pouvez expérimenter les autres types et examiner les résultats. DIM r AS RECT
DIM x AS LONG DIM bRef AS LONG DIM info AS ControlTabInfoRec // les titres des onglets individuels _nbOnglets = 3 DIM titreOnglet$(_nbOnglets) titreOnglet$(1) = "Un" titreOnglet$(2) = "Deux" titreOnglet$(3) = "Trois" // création d’une fenêtre SetRect( r, 0, 0, 300, 200 ) APPEARANCE WINDOW 1, "Bouton à onglets", @r, _kDocumentWindowClass DEF SETWINDOWBACKGROUND( _kThemeActiveDialogBackgroundBrush, _zTrue) /* le bouton n° 100 est le contrôle principal. Sa taille englobe la zone de contenu. Dans cet exemple, la taille correspond à la fenêtre entière moins une petite marge. Les boutons numérotés 1, 2 & 3 seront les panneaux utilisateur imbriqués qui contiendront les informations à afficher pour chacun des panneaux. Les boutons à onglets sont toujours construits dans un état invisible. Les informations contenues dans ce type de contrôle sont modifiées au fur et à mesure de la construction. Afficher le contrôle une fois que la fenêtre est construite donne un résultat beaucoup plus propre l’écran. */ _btnOngletsRef = 100 _margeBtn = 8 InsetRect( r, _margeBtn, _margeBtn ) APPEARANCE BUTTON -_btnOngletsRef, 0, 0, 2, _nbOnglets, , @r, _kControlTabSmallNorthProc /* Corrige le bouton pour qu’il utilise une petite police de caractères. Ce n’est pas une nécessité, mais cette information pourra vous être utile à l’occasion. */ DIM cfs AS ControlFontStyleRec cfs.flags = _kControlUseSizeMask cfs.size = 9 DEF SETBUTTONFONTSTYLE( _btnOngletsRef, cfs ) /* Adapte un rectangle pour qu’il puisse être utilisé comme zone de contenu de chacun des panneaux. */ InsetRect( r, _margeBtn, _margeBtn ) r.top += 20 /* Passe en revue les onglets et assigne les panneaux individuellement */ FOR x = 1 TO _nbOnglets info.version = _kControlTabInfoVersionZero info.iconSuiteID = 0 info.Name = titreOnglet$(x) DEF SETBUTTONDATA(_btnOngletsRef,x,_kControlTabInfoTag,SIZEOF(info),info) /* Chaque panneau est un bouton qui est imbriqué dans le contrôle principal. Le premier sera visible. Tous les autres seront invisibles. A tout instant, un seul panneau doit être affiché. Note : les numéros de référence négatifs rendent les boutons invisibles. Une fois qu’un panneau (_kControlUserPaneProc) a été créé, il est imbriqué dans le contrôle principal. */ IF x != 1 THEN bRef = -x ELSE bRef = x APPEARANCE BUTTON bRef,,_kControlSupportsEmbedding,,,, @r, _kControlUserPaneProc DEF EMBEDBUTTON( x, _btnOngletsRef ) NEXT /* Maintenant, nous avons un contrôle principal (_btnOngletsRef = 100) dans lequel nous avons imbriqué trois panneaux utilisateur (1,2, et 3). En guise de démonstration, nous allons placer un simple bouton dans chacun des trois panneaux. Bouton n° 10 dans le panneau 1 Bouton n° 20 dans le panneau 2 Bouton n° 30 dans le panneau 3 */ InsetRect( r, 32, 32 ) r.bottom = r.top + 24 r.right = r.left + 128 APPEARANCE BUTTON 10, _activeBtn,,,, "Panneau #1", @r, _kControlPushButtonProc DEF EMBEDBUTTON( 10, 1 ) OffsetRect( r, 8, 8 ) APPEARANCE BUTTON 20, _activeBtn,,,, "Panneau #2", @r, _kControlPushButtonProc DEF EMBEDBUTTON( 20, 2 ) OffsetRect( r, 8, 8 ) APPEARANCE BUTTON 30, _activeBtn,,,, "Panneau #3", @r, _kControlPushButtonProc DEF EMBEDBUTTON( 30, 3 ) BUTTON _btnOngletsRef, 1 // rend visible /* Un seul événement répond à un clic sur le contrôle principal. La valeur retournée (1,2, ou 3) correspond au rang du panneau imbriqué dans le contrôle parent (1, 2, ou 3). Notre seule action est de masquer (BUTTON -x) ou d’afficher (Button x) le panneau de manière appropriée. Tous les contrôles contenus dans chacun des panneaux seront automatiquement affichés ou masqués. */ LOCAL FN GererDialogue DIM AS LONG action, reference, j action = DIALOG(0) reference = DIALOG(action) LONG IF action == _btnClick AND reference == _btnOngletsRef FOR j = 1 TO _nbOnglets LONG IF j == BUTTON(_btnOngletsRef) BUTTON j XELSE BUTTON -j END IF NEXT END IF END FN ON DIALOG FN GererDialogue DO HANDLEEVENTS UNTIL 0 Voir Aussi : BUTTON&; BUTTON fonction; BUTTON CLOSE; SCROLL BUTTON; DIALOG fonction; DEF EMBEDBUTTON; DEF SETBUTTONDATA |
||||||||||||||||||||||||||||||