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.

id&
un nombre entier positif ou négatif dont la valeur absolue est dans l’intervalle 1 à 2147483647. Le nombre que vous assignez doit être différent de celui assigné à tout autre bouton ou barre de défilement présents dans la fenêtre. Les valeurs négatives construisent les boutons dans un état invisible. Les valeurs positives les construisent dans un état visible.
etat
l’état du bouton peut prendre les valeurs suivantes:

_grayBtn (0/désactivé)
_activebtn (1/défaut/actif)
_markedBtn(2/sélectionné)
valeur, min, max
généralement ce sont des valeurs entières précisant la valeur initiale, le minimum et le maximum pour ce contrôle.
titre$
une expression chaîne de caractères. Ce paramètre n’est pas utilisé pour attribuer le texte des boutons définis avec _kControlStaticTextProc ou _kControlEditTextProc.
Voir DEF SETBUTTONTEXTSTRING pour savoir comment cela peut s’accomplir.
rect
un rectangle en coordonnées locales à la fenêtre que vous pouvez exprimer sous deux formes :
(x1,y1)-(x2,y2) Deux points diagonalement opposés.
@rectAdresse& Une expression sur un entier long ou un pointeur sur une variable qui pointe sur une structure de 8 octets telle qu’une variable de type RECT.
type
L’un des nombreux types listés dans le texte qui suit.

Note :

A la création d’un bouton, les valeurs par défaut attribuées aux paramètres éventuellement manquants sont :

etat _activebtn
valeur 1
min 0
max 1
titre$ chaîne nulle

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

                      
Groupes & Séparateurs dans OS X et le Système 9

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.appearancebuttonhtm05

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

appearancebuttonhtm04
Cases à cocher

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.

Boutons Date/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 :


L’Appearance Manager propose plusieurs méthodes pour indiquer à l’utilisateur que votre application est occupée à exécuter une tâche particulière. Ceci inclue les flèches poursuite ou tournoyantes et les barres de progression à durée finie ou indéterminée.

Le contrôle flèches tournoyantes est facile à créer et à gèrer. Chaque fois que votre programme exécute sa boucle événementielle principale, les flèches sont alors animées. Les instructions suivantes créent un contrôle flèches tournoyantes :

APPEARANCE BUTTON bRef,_activeBtn,0,0,1,,@r,_kControlChasingArrowsProc

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) :


Il y a plusieurs variantes de glissières. Toutes se réfèrent à la simple constante _kControlSliderProc. Les paramètres supplémentaires ajoutés à cette constante déterminent les caractéristiques de la glissière. Les constantes pour les variantes sont les suivantes :

_kControlSliderLiveFeedback
_kControlSliderHasTickMarks
_kControlSliderReverseDirection
_kControlSliderNonDirectional

Pour créer une glissière dont l’indicateur pointe vers le haut et qui possède des marques de division, le type suivant pourrait être utilisé :

_kControlSliderProc + _kControlSliderHasTickMarks + _kControlSliderReverseDirection


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

Contrôle liste 

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.

Bouton à onglets 

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 :