|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
L'inspecteur Gadget (suite) Reprenons notre étude de la structure Gadget là où nous l'avions laissée, c'est-à-dire juste après les "Activation Flags". On trouve à leur suite un mot qui détermine le type du gadget :
On n'utilisera en général que l'un des trois premiers types possibles (BOOL, PROP ou STR). Sachez toutefois que l'expression "gadget système" regroupe tous les gadgets "standard" de fenêtre et d'écran listés dans ce tableau. Viennent ensuite dans la structure plusieurs pointeurs. Le premier désigne l'adresse d'une structure Image, au cas où votre gadget en contiendrait une (une Image n'est rien d'autre qu'un motif défini par vous, qu'Intuition dessinera dans votre gadget. Voir plus loin dans cette même rubrique). Le second désigne l'adresse d'une seconde structure Image, qui sera affichée à la place de la première lorsque le gadget sera sélectionné, ce qui permet des effets intéressants, par exemple un interrupteur ON/OFF, etc. Ceci n'est bien sûr valable que si le bit "GADHIMAGE" est mis dans les Gadgets Flags (Cf. mois dernier). Le troisième pointeur désigne l'adresse d'une structure IntuiText, au cas où nous voudrions afficher un texte quelconque dans notre gadget (pour le détail d'une structure IntuiText, voir cet article). On trouve ensuite un mot long nommé "Exclude" qui indique si l'activation de notre gadget doit provoquer la désactivation d'autres gadgets présents. On assure de source normalement bien informée, que cette fonction n'est pas d'une fiabilité exemplaire, qu'elle provoquerait un Guru de temps en temps... Voilà une affirmation que je n'ai pas encore eu la chance, si l'on peut appeler ça de la chance, de vérifier. On continue la structure Gadget avec un pointeur sur une structure SpecialInfo, qui ne sera utilisée qu'avec les gadgets de chaîne, entiers et proportionnels. Nous y reviendrons en temps et en heure, c'est-à-dire dans quelques paragraphes. Il ne nous reste plus qu'à donner un numéro d'identification (ID) à notre gadget, et la structure sera complète, le dernier mot long, "User Data", étant géré de manière interne par Intuition. La structure Gadget telle que je viens de la décrire est valable pour un gadget de type booléen. Il faudra lui faire subir quelques modifications, heureusement mineures, pour un gadget de chaîne ou proportionnel. Travail à la chaine Qu'est-ce donc qu'un gadget dit "de chaîne" ? L'exemple évitant toujours de longues et ennuyeuses explications, en voici un : la fonction "Rename" du Workbench utilise un gadget de chaîne pour recevoir le nouveau nom de l'objet concerné. Il s'agit en gros d'un moyen simple et élégant d'attendre une entrée au clavier de la part de l'utilisateur. D'autant plus que de tels gadgets disposent de plusieurs facilités d'édition :
Examinons tout ça de plus près... Le premier mot long pointe sur un tampon mémoire suffisamment grand pour recevoir le texte entré. Le second mot long pointe sur un tampon mémoire "Undo", qui servira lors de l'appui sur les touches Amiga droite/A. Le mot "Start Cursor" détermine la position du curseur dans la chaîne à l'ouverture du gadget ; il vaut mieux le fixer à 0 pour qu'il pointe sur le premier caractère ! Le mot "Maximum Length" détermine le nombre maximum de caractères que le texte pourra contenir. "First Char" indique à partir de quel caractère du texte celui-ci doit être édité. Il vaut mieux également le mettre à 0, afin que ce soit à partir du premier caractère. Les cinq mots suivants seront utilisés par Intuition durant l'édition du texte. On y trouvera à la sortie divers renseignements, tel le nombre de caractères effectivement entrés, etc. "RastPort", maintenant familier, n'a pas à être initialisé par nous ; pour une fois, Intuition s'en chargera tout seul, comme un grand. "Integer" contiendra, en fin d'édition, la valeur entrée dans un gadget de type entier. Enfin, "Keymap" pointe sur une table de définition de clavier présente en mémoire, qui sera utilisée lors de l'édition du texte. Tout ceci à condition bien entendu que vous ayez fixé le bit "ALTKEYMAP" dans les Gadget Flags (encore une fois, Cf. mois dernier). Les gadgets entiers ne sont, finalement, qu'une variante des gadgets de chaîne, qui ne permettent que l'édition de chiffres (0 à 9). La valeur entrée au clavier sera automatiquement convertie par Intuition en un mot long et placée au label "Integer". C'est tout. De la proportion C'est ici que les choses se compliquent un peu. Le booléen, ça va, les chaînes aussi, mais les gadgets proportionnels, c'est autre chose, ça, ma bonne dame. Je vous conseille donc de vous asseoir confortablement avant de continuer à lire. Des gadgets proportionnels, vous en utilisez plus souvent que vous ne le croyez : les ascenseurs dans les fenêtres en sont, pour ne citer qu'eux. Il s'agit donc de gadgets qui donnent la possibilité de déplacer un curseur dans un cadre donné. Les tailles du curseur et du cadre sont bien entendu totalement définissables. Pour programmer de tels gadgets, il nous faut évidemment une structure Gadget, identique à celle déjà vue. Le mot "Gadget Type" devra être fixé sur 3 (Proportional Gadget), le pointeur "Image" désignera la structure Image définissant le curseur, et le pointeur "Special Info" désignera l'adresse d'une structure Propinfo, structure que voici, sans plus attendre, détaillée pour vous :
Seuls les quatre premiers bits du mot "PropFlags" sont significatifs :
Une fois n'est pas coutume, commençons par la fin : normalement, lorsqu'un gadget de type proportionnel est mis en oeuvre, Intuition encadre automatiquement le curseur (comme il le fait pour un titre de menu, par exemple). Fixer le bit PROPBORDERLESS permet d'éviter cet encadrement. FREEVERT et FREEHORIZ autorisent, s'ils sont fixés, le déplacement vertical et horizontal (respectivement) du curseur à l'intérieur de son cadre. Au moins l'un de ces deux bits doit être mis ! AUTOKNOB est d'un grand secours pour la mise au point de programmes, en attendant la version finale, plus esthétique. Ce bit fait en sorte qu'Intuition gère de lui-même la forme et la taille du curseur, proportionnellement au cadre qui le contient. Très pratique. Revenons à la structure PropInfo. Hpos et Vpos contiennent les positions de départ du curseur, relativement aux bords du cadre qui le contient. Des valeurs comprises entre $0 (gauche/haut) à $FFFF (bas/droite) sont autorisées. HorizBody et VertBody déterminent le pas de déplacement du curseur dans son cadre. Prenons pour exemple un gadget permettant de régler l'intensité d'un son. Le programme autorise des valeurs entières comprises entre 0 et 63, soit 64 valeurs différentes possibles. Dans ce gadget, si Hpos (ou Vpos, ne soyons pas sectaires) est égal à 0, le curseur sera totalement à gauche dans son cadre (respectivement, en haut) ; si au contraire, Hpos vaut $FFFF, le curseur sera totalement à droite dans son cadre (respectivement, en bas). Pour obtenir exactement 64 positions possibles pour le curseur, il faut spécifier pour HorizBody la valeur $FFFF/64, soit $400 (1024 décimal). Compris ? Bon, plus généralement, les valeurs HorizBody et VertBody se calculent d'après la formule : $FFFF/Nombre de positions du curseur possibles. Les 6 derniers mots de la structure PropInfo sont gérés de manière interne par Intuition ; on y retrouve, à la fermeture du gadget, les nouvelles positions du curseur à l'intérieur de son cadre, entre autres. Pour le cas où le bit AUTOKNOB serait fixé, et pour reprendre l'exemple ci-dessus, notre curseur ferait exactement 1/64e de la taille totale du cadre. Dans le cas contraire, c'est à vous de faire en sorte, en le dessinant, qu'il soit à la bonne taille. L'image a la parole Si vous reprenez la structure Gadget, vous remarquerez un pointeur sur une structure Image, qui définit l'aspect de votre gadget. Une telle structure n'est vraiment pas longue à initialiser :
Les quatre premiers mots ne posent aucun problème de compréhension. Faites seulement attention à ce que Xpos et Ypos soient exprimés relativement aux bords du gadget, de la fenêtre ou de l'écran père de l'Image (une Image peut en effet être dessinée dans une fenêtre ou un écran. Hein ? Vous ne me croyez pas ? Et les icônes du Workbench, c'est du poulet, peut-être ?). Le cinquième mot définit, de la même manière que pour un écran, sa profondeur, c'est-à-dire le nombre de plans de bits qui composent l'Image, c'est-à-dire enfin le nombre de couleurs. Il semble évident que ce nombre ne peut être supérieur à celui de l'écran père. Suit alors un pointeur sur les données graphiques de l'image elle-même, définies plan de bits par plan de bits. L'octet "PlanePick" est un peu plus délicat à saisir ; si vous avez déjà programmé des BOB en AmigaBasic, cette notion devrait vous être familière. Dans le cas contraire, voici une succincte explication : il n'est pas obligatoire que l'Image s'affiche plan de bits par plan de bits à l'écran. On peut faire en sorte, par exemple, que le premier plan de bit de l'Image soit écrit dans le second plan de bits de l'écran, etc. Ceci permet de faire varier les couleurs d'une même Image, sans avoir à la redessiner entièrement. Dit de manière encore plus simple, "PlanePick" détermine les couleurs de l'Image. "PlaneOnOff" est du même acabit : cet octet détermine ce qu'il adviendra des plans de bits non affectés par l'affichage de l'Image ; si vous désirez que ceux-ci restent tels quels, indiquez zéro, et s'ils doivent être inversés, indiquez un. Et on termine cette structure Image par un pointeur sur d'éventuelles données graphiques supplémentaires. Un petit mot pour en terminer avec les Images : comme je crois l'avoir fait remarquer plus haut, une Image peut-être dessinée n'importe où, que ce soit dans une fenêtre, un écran, ou une requête. Il existe une fonction Intuition, "DrawImage" (décalage ?114) qui attend quatre paramètres :
Border Quèsako, "Border" ? Si je vous dis qu'en français bien de chez nous, "Border" signifie "bord", vous ne serez guère plus avancés. Simplement, il s'agit d'un élément d'Intuition qui permet de dessiner des cadres d'un nombre quelconque de côtés. Un exemple aussi bête qu'idiot est une fenêtre : ce n'est plus ni moins d'un Border à quatre côtés ! L'avantage de pouvoir utiliser les Borders directement dans nos requêtes est évident : l'esthétique. Bien sûr, cela demande de s'em... s'enquiquiner un peu plus lors de la programmation, mais le résultat est tout de même beaucoup plus beau. Voyons d'abord le cas le plus simple. Nous voulons dessiner un Border, comme ça, à l'écran, par caprice ou par nécessité. Intuition met une fois de plus une de ses fonctions à notre disposition, j'ai nommé DrawBorder. De décalage -108, elle attend quatre paramètres :
Et c'est reparti mon kiki. "Xoffset" et "Yoffset" indiquent les coordonnées du premier point, relativement à celles données lors de l'appel de la fonction. Ça peut sembler ridicule et superflu, comme ça, mais lorsque le Border est intégré à une requête, "Xoffset" et "Yoffset" indiquent les coordonnées du premier point relativement au bord de la requête. "DetailPen" et "BlockPen" sont désormais familiers, je ne m'étendrai donc pas dessus. Sachez seulement que "BlockPen" est ici inutilisé, allez savoir pourquoi (moi je sais, mais faites donc un effort intellectuel, que diable !). "DrawMode" n'est pas lui non plus un inconnu, il détermine le mode de dessin (JAM1, JAM2, etc.). Le mot suivant indique le nombre de points dans le cadre ; n'oubliez jamais qu'il faut trois points pour dessiner deux droites ayant un sommet commun. Le mot long suivant pointe sur la table des coordonnées de chacun des points du cadre, un par un, à la suite l'un de l'autre. Et finalement, suit un pointeur sur une éventuelle structure Border supplémentaire. Comme d'habitude, un zéro indique qu'il n'y a pas d'autre structure. Et de quatre ! Quatre quoi ? Mais voyons, quatre pages bien remplies, c'est déjà pas si mal. Du coup, je vous donne rendez-vous au mois prochain où nous verrons comment intégrer une Image et un Border dans une requête, faisant elle-même partie d'une fenêtre, elle-même assujettie à un écran. M'excuserez si j'omets le menu.
|