Ce chapitre décrit un ensemble de fonctions permettant de manipuler les objets d'une boîte de dialogue. Ces fonctions sont toujours utilisables, à partir du moment ou l'arbre existe, qu'il soit affiché ou non et que l'objet considéré soit visible, partiellement visible ou entiŠrement chaché.

Qu'est-ce qu'un objet ?

Un objet est l'élément de base d'une boîte de dialogue (qui est un assemblage ordonné et hiérarchisé d'objets), il représente un bouton ou un texte de cette boîte.

Pour des raisons de simplicité, la structure d'objet de l'AES a été adoptée pour cette bibliothŠque :


typedef struct
{
  int ob_next;  /* Numéro de l'objet suivant    */
  int ob_head;  /* Numéro du premier objet fils */
  int ob_tail;  /* Numéro du dernier objet fils */
  int ob_type;  /* Nature de l'objet         */
  int ob_flags; /* Indicateurs divers        */
  int ob_state; /* État de l'objet           */
  union
  {
    char         *texte;      /* Pour Button, String, Title            */
    TEDINFO      *tedinfo;    /* Pour Text, Boxtext, Ftext et FBoxtext */
    USERBLK      *util;       /* Pour Userdef                          */
    ICONBLK      *icone;      /* Pour Icon                             */
    CICONBLK     *icone_coul; /* Pour les icônes couleur, Cicon        */
    BITBLK       *image;      /* Pour les images noir et blanc         */
    Texte_Infini *txt_infini; /* Pour les textes de longueur infinie   */
    long          autre;
  } ob_spec; /* Caractéristiques spécifiques de l'objet */
  int ob_x;     /* Position de l'objet RELATIVE AU PÈRE */
  int ob_y;
  int ob_width; /* Dimensions de l'objet */
  int ob_height;
} OBJECT;

A priori, vous n'avez pas besoin de connaître particuliŠrement la signification des différents champs pour manipuler les objets dans cette bibliothŠque, en particulier si vous utilisez un logiciel spécialisé dans la conception des boîtes de dialogue pour créer des fichiers RSC ou du code C à inclure.

Si vous voulez davantage d'informations à ce sujet, consultez un livre sur la programmation du GEM.

Modifier l'état d'un objet

boolean OBJ_active(int arbre,
                   int objet,
                   boolean mode)

Permet d'activer ou désactiver un l'objet objet de l'arbre arbre. La fonction renvoie VRAI si l'objet est actif, FAUX si l'objet est inactif aprŠs l'opération. mode permet de contrôler l'opération :
Type de modification possible
mode action
FORCE_OUI On active
FORCE_NON On désactive
ECHANGE On active s'il était désactivé
On désactive s'il était activé
QUESTION Aucune, on demande juste l'état actuel

Les valeurs sont choisies de telle sorte que FORCE_OUI corresponde à une vérité logique et FORCE_NON à une erreur logique. Ainsi, s'il faut désactiver un objet si a < 2, on peut directement utiliser OBJ_active(arbre, objet, a >= 2).

Si l'arbre est affiché et l'objet visible, il est redessiné aprŠs modification de l'état. Si un objet éditable contenant le curseur est désactivé, le curseur est placé sur le premier objet éditable actif suivant de l'arbre ; s'il n'y en a pas, il est placé sur le premier objet éditable actif de l'arbre. Si un objet éditable est activé et s'il n'y avait aucun curseur texte auparavant, le curseur texte est placé à la fin du texte de cet objet éditable.


void OBJ_agrandit(int arbre,
                  int objet,
                  int larg,
                  int haut)

Permet de modifier la taille d'un objet de fa‡on relative. arbre et objet précisent l'objet à modifier ; larg et haut indiquent la variation de dimension en largeur et en hauteur à appliquer (0 : aucune variation ; +1 : augmenter de 1 pixel ; -1 : diminuer d'un pixel).

Si l'arbre est affiché et l'objet visible, il est redessiné.


boolean OBJ_cache(int arbre,
                  int objet,
                  boolean mode)

Permet de rendre visible ou invisible l'objet objet de l'arbre arbre. Si l'arbre est affiché, la région concernée est redessinée de fa‡on à rendre ce changement visible. Si un objet est invisible, tous ses fils sont invisibles. mode permet de contrôler l'opération :
Type de modification possible
mode action
FORCE_OUI On cache
FORCE_NON On rend visible
ECHANGE On cache s'il était visible
On rend visible s'il était invisible
QUESTION Aucune, on demande juste l'état actuel

La fonction renvoie l'état de l'objet aprŠs l'opération.


boolean OBJ_coche(int arbre,
                  int objet,
                  boolean mode)

Permet de marquer comme coché ou non l'objet objet de l'arbre arbre ; mode permet de contrôler le sens de l'opération, avec les valeurs suivantes :
Type de modification possible
mode action
FORCE_OUI On coche
FORCE_NON On décoche
ECHANGE On coche s'il n'était pas coché
On décoche s'il était coché
QUESTION Aucune, on demande juste l'état actuel

Si l'objet est visible, il est redessiné. Un objet coché est dessiné avec une espŠce de V qui occupe les deux caractŠres les plus à gauche de l'objet.

La fonction renvoie l'état de l'objet aprŠs l'opération.


boolean OBJ_choisit(int arbre,
                    int objet,
                    boolean mode)

Permet de marquer comme sélectionné ou non l'objet objet de l'arbre arbre ; mode permet de contrôler le sens de l'opération, avec les valeurs suivantes :
Type de modification possible
mode action
FORCE_OUI On sélectionne
FORCE_NON On désélectionne
ECHANGE On sélectionne s'il n'était pas choisi
On désélectionne s'il était choisi
QUESTION Aucune, on demande juste l'état actuel

Un objet sélectionné est affiché de fa‡on différente suivant le type et le systŠme :

Si on demande de sélectionner un objet avec l'attribut RADIOBUTTON, tous les autres objets ayant le même pŠre et cet attribut sont automatiquement désélectionnés.

Si l'objet est visible, il est redessiné.

La fonction renvoie l'état de l'objet aprŠs l'opération.


int OBJ_couleur(int arbre,
                int objet,
                int couleur,
                boolean partie,
                boolean mode)

Permet de modifier la couleur de l'un des éléments de l'objet, si cet objet autorise cette modification. arbre et objet permettent de définir l'objet à traiter ;couleur est l'index de couleur AES à utiliser, compris entre 0 et 15. partie précise la partie de l'objet à modifier :
Parties dont on peut modifier la couleur
partie Partie Remarque
COULEUR_BORD Bord
COULEUR_FOND Fond
COULEUR_TEXTE Texte

Si mode vaut METTRE, on installe effectivement la couleur, s'il vaut QUESTION, on ne fait que la demander. Dans le premier cas, l'objet est redessiné s'il est visible.

La fonction renvoie l'index de couleur de la partie choisie.


void OBJ_deplace(int arbre,
                 int objet,
                 int x, int y,
                 boolean mode)

Permet de déplacer un objet de fa‡on relative. arbre et objet permettent de définir l'objet à traiter ; x et y indiquent de combien on doit déplacer l'objet dans chaque direction.

Si mode vaut DEPLACE_PIXELS, x et y indiquent un décalage en pixels ; si mode vaut DEPLACE_RELATIF, ils indiquent un déplacement en pour-milles de la largeur et de la hauteur de l'objet.

Si l'arbre est affiché, la région concernée est redessinée.


void OBJ_position(int arbre,
                  int objet,
                  int x, int y,
                  int *nv_x, int *nv_y)

Permet de placer de fa‡on absolue l'objet objet de l'arbre arbre. x et y indiquent la position absolue, en pixels, de l'objet par rapport à son pŠre ; une valeur de -1 indique que l'on ne veut pas changer la valeur actuelle.

nv_x et nv_y contiennent la position absolue de l'objet par rapport à son pŠre aprŠs l'opération.


void OBJ_taille(int arbre,
                int objet,
                int larg, int haut,
                int *nv_larg, int *nv_haut)

Identique à la fonction ci-dessus, mais pour les dimensions de l'objet.


long OBJ_utilisateur(int arbre,
                     int objet,
                     int (*fonction)(PARMBLK *),
                     long parametre,
                     boolean mode)

Permet de modifier les paramŠtres d'un objet G_USERDEF (objet défini par l'utilisateur). Si l'objet objet de l'arbre arbre n'est pas un objet G_USERDEF, la fonction ne fait rien et renvoie 0. Sinon, elle renvoie la valeur du parmŠtre associé à l'objet indiqué.

Si mode vaut QUESTION, la fonction se contente de renvoyer la valeur du paramŠtre associé à l'objet indiqué.

Si mode vaut METTRE, la fonction installe parametre comme paramŠtre associé à l'objet ; si fonction ne vaut pas NULL, elle définit fonction comme fonction de redessin associée à l'objet. Cette fonction sera donc appelée à chaque fois que l'objet devra être dessiné. Si l'objet est visible, il est redessiné.

Gestion des objets contenant du texte

Les fonctions qui suivent permettent de faciliter la gestion des objets contenant du texte en permettant de récupérer leur contenu ou de le modifier simplement, en particulier dans le cas de valeurs numériques.

char *lit_chaine(int arbre,
                 int objet,
                 unsigned long l_max,
                 char *texte,
                 char mode)

Renvoie l'adresse du texte associé à l'objet objet de l'arbre arbre.

Si mode vaut TXT_COPIER et si texte est non NULL, la fonction copie aussi au plus l_max caractŠres du texte de l'objet dans la chaîne texte.


void met_chaine(int arbre,
                int objet,
                unsigned long l_max,
                char *texte,
                char mode)

Modifie le texte associé à l'objet objet de l'arbre arbre. texte contient le nouveau texte de l'objet.

Si mode vaut TXT_COPIER, la fonction copie au plus l_maxcaractŠres de texte dans la chaîne contenant le texte de l'objet. Si l'objet est de type G_FTEXT ou G_FBOXTEXT, le texte modifié est le texte éditable par l'utilisateur ; la fonction vérifie que ce texte peut bien accueillir les l_max caractŠres.

Si mode vaut TXT_REMPLACE, la fonction place la chaîne texte comme nouvelle chaîne associée à l'objet. Si l'objet est de type G_FTEXT ou G_FBOXTEXT, le texte modifié est le masque (non modifiable par l'utilisateur) ; la fonction y compte les caractŠres éditables (indiqués par le caractŠre _) et étend au besoin la chaîne contenant le texte entré par l'utilisateur.

Si l'objet est visible, il est redessiné.


void met_valeur(int arbre,
                int objet,
                int valeur)

Met le nombre valeur comme texte de l'objet objet de l'arbre arbre. Si le nombre est trop grand pour tenir, l'effet est indéterminé sauf pour un objet de type G_FTEXT ou G_FBOXTEXT (le nombre affiché est alors le plus grand nombre affichable).

Si l'objet est visible, il est redessiné.


void met_lvaleur(int arbre,
                 int objet,
                 long valeur)

Comme ci-dessus, mais pour une valeur de type long.


void met_ulvaleur(int arbre,
                  int objet,
                  unsigned long valeur)

Comme ci-dessus, mais pour une valeur de type unsigned long.


void met_fvaleur(int arbre,
                 int objet,
                 double valeur)

Affiche le nombre réel valeur comme texte de l'objet objet dans l'arbre arbre. Si cet objet est visible, il est redessiné.

Si l'objet est de type G_STRING ou G_BUTTON, la valeur est affichée avec le modŠle %6.3f. Le résultat est indéfini si la chaîne associée à l'objet n'est pas assez grande pour y stocker cette valeur.

Si l'objet est de type G_FTEXT ou G_FBOXTEXT, la bibliothŠque suppose que le masque est de la forme

(texte) ___._____ (texte)

La valeur à afficher est alors convertie en chaîne de fa‡on à coller avec le masque ci-dessus. Si la partie entiŠre comporte moins de chiffres que ne l'autorise le masque, les premiŠres positions sont occupées par des espaces. Si la partie décimale finit par des zéros, ils ne sont pas affichés.


void met_svaleur (int arbre,
                  int objet,
                  double valeur)

Comme ci-dessus, mais la valeur est affichée sous forme scientifique. Pour un objet éditable, le masque doit être de la forme

(texte) __._____ (texte) ___ (texte)
        s9 ddddd         eee

int prend_valeur(int arbre,
                 int objet)

Lit le texte associé à l'objet objet de l'arbre arbre et le convertit en un nombre entier de type int, renvoyé par la fonction.


long prend_lvaleur(int arbre,
                  int objet)

Comme ci-dessus, mais renvoie un nombre entier de type long


unsigned long prend_ulvaleur(int arbre,
                             int objet)

Comme ci-dessus, mais renvoie un nombre entier positif de type unsigned long.


float prend_fvaleur(int arbre,
                    int objet)

Comme ci-dessus, mais renvoie un nombre réel de type float. Si l'objet est de type G_FTEXT ou G_FBOXTEXT, la bibliothŠque suppose un masque de même type que dans met_fvaleur.


double prend_svaleur(int arbre,
                     int objet)

Comme ci-dessus, mais suppose que le nombre contenu dans le texte est écrit dans la notation scientifique. Si l'objet est de type G_FTEXT ou G_FBOXTEXT, la bibliothŠque suppose un masque de même type que dans met_svaleur.