Pagina principale faq Amiga Life a Pianeta Amiga La redazione
Galleria Indice generale
Enigma Amiga Life

AmigaLife 122 ?

AmigaDev
Amiga C
di Gabriele Santilli

Quinta parte

Questo mese è il turno della libreria GadTools: un po' fuori moda forse, ma ancora interessante, almeno dal punto di vista di un corso di programmazione su Amiga. "GadTools è una nuova libreria della Release 2 pensata per semplificare la creazione di interfacce utente con Intuition" recitano i RKRM...

Nozioni fondamentali

Nella terza puntata del corso abbiamo mosso i primi passi verso Intuition, la GUI di AmigaOS. Come abbiamo detto, i suoi componenti fondamentali sono schermi, finestre, menù e gadget; ci siamo fatti un'idea di cosa sono schermi e finestre, ma non abbiamo ancora parlato di menù e gadget: gestire questi ultimi con le sole funzioni offerte dalla intuition.library risulta infatti un po' complicato. La gadtools.library (introdotta col 2.0) semplifica il lavoro del programmatore e offre un look "standard" per le applicazioni (per quanto esso sia ormai datato).
I menù sono familiari a tutti, e penso non sia necessario soffermarsi ulteriormente su di essi; i gadget sono aree rettangolari all'interno di una finestra con le quali si può interagire con il mouse. L'esempio più classico di gadget è il pulsante "Ok" presente in molti pannelli di richiesta, ma lo sono anche le barre di scorrimento delle finestre del WorkBench, così come il pulsante di chiusura delle finestre e la stessa barra di trascinamento di queste ultime.
Gadget e menù sono quindi il mezzo primario di comunicazione tra l'utente e i nostri programmi, e la libreria GadTools ci permette di studiarne il funzionamento senza scendere troppo in dettaglio.

I gadget

La gadtools.library offre 12 diversi tipi di gadget (vedere tabella 1); per creare un gadget, è necessario usare la funzione CreateGadget(), i cui parametri sono il tipo di gadget, un puntatore al gadget precedente, un puntatore ad una struttura NewGadget () e una Tag List.

La struttura NewGadget è definita nel modo seguente:


struct NewGadget

{

  WORD ng_LeftEdge, ng_TopEdge;  /* posizione del gadget */

  WORD ng_Width, ng_Height;      /* dimensioni */

  STRPTR ng_GadgetText;          /* etichetta */

  struct TextAttr *ng_TextAttr;  /* font da usare per l'etichetta */

  UWORD ng_GadgetID;             /* ID del gadget, ad uso del programmatore */

  ULONG ng_Flags;                /* flag per il posizionamento dell'etichetta */

  APTR ng_VisualInfo;            /* da impostare al risultato di GetVisualInfo() */

  APTR ng_UserData;              /* campo UserData del gadget */

};

Il campo ng_GadgetText punta al testo dell'etichetta (ad esempio quello che compare all'interno di un pulsante o accanto ad un gadget stringa), che deve restare valido e costante per tutta la vita del gadget, dato che non viene copiato; il campo ng_VisualInfo è un puntatore ad una struttura VisualInfo, necessaria per la creazione e la visualizzazione del gadget. Essa è privata e non è possibile accedere ai suoi campi; è possibile ottenerla con la funzione GetVisualInfo(), che richiede come parametri un puntatore allo schermo nel quale compariranno i gadget e una Tag List (non è definito alcun tag per questa funzione, ed è ormai improbabile che GadTools venga esteso in futuro; tuttavia, al contrario di quello che avviene in altri sistemi operativi, la possibilità di estensioni era stata presa in considerazione fin dall'inizio). Per liberare la struttura (dopo aver liberato tutti i gadget e i menù GadTools e prima di rilasciare lo schermo) è necessario chiamare FreeVisualInfo().

Il puntatore al gadget precedente è necessario per realizzare una lista (ogni gadget Intuition punta al gadget successivo); per il primo gadget (o se si crea un solo gadget) è necessario passare il risultato della funzione CreateContext(). Si veda l'esempio sul CD per i dettagli.

La gestione degli eventi

Nel caso in cui una finestra contenga gadget GadTools, è necessario dare alla libreria la possibilità di filtrare i messaggi di Intuition; in questo modo l'applicazione viene a conoscenza solo delle informazioni utili, e non deve preoccuparsi di tutti quei messaggi necessari a GadTools per gestire i gadget.

Per questo motivo, la libreria offre le funzioni GT_GetIMsg() e GT_ReplyIMsg(), che l'applicazione deve usare al posto di GetMsg() e ReplyMsg(). Per il resto, il funzionamento resta lo stesso. Per i dettagli si può fare riferimento all'esempio sul CD.

Altra questione da considerare sono i flag IDCMP della finestra; come abbiamo detto in precedenza, è necessario specificare ad Intuition quali classi di eventi si desidera ricevere. Poiché ogni tipo di gadget GadTools ha bisogno di ricevere alcuni tipi di eventi per funzionare, in sono definiti delle costanti che raggruppano gli IDCMP necessari per ogni particolare tipo di gadget (ad esempio, SLIDERIDCMP definisce i flag necessari ai gadget di tipo slider). Il programmatore deve specificare i flag ottenuti facendo l'OR delle costanti relative ai tipi di gadget usati (ad esempio, se in una finestra si usano gadget di tipo BUTTON, CHECKBOX e LISTVIEW, è necessario specificare BUTTONIDCMP | CHECKBOXIDCMP | LISTVIEWIDCMP). Fatto questo, (quasi) tutto il resto è gestito da GadTools.

I menù

Oltre ai gadget, la gadtools.library permette anche di creare in modo semplice i menù. Per farlo è infatti sufficiente specificare una array di strutture NewMenu:


struct NewMenu

{

  UBYTE nm_Type;          /* Tipo di elemento */

  STRPTR nm_Label;        /* Etichetta dell'elemento */

  STRPTR nm_CommKey;      /* Tasto per l'invocazione da tastiera */

  UWORD nm_Flags;         /* Flag per l'elemento */

  LONG nm_MutualExclude;  /* Per elementi mutualmente esclusivi */

  APTR nm_UserData;       /* Ad uso del programmatore */

};

Ogni elemento dell'array rappresenta, a seconda del tipo, un menù, l'elemento di un menù oppure l'elemento di un sottomenù. L'array è terminato con un elemento di tipo NM_END.

Creato l'array (per i dettagli si faccia riferimento all'esempio), la funzione CreateMenus() si occupa di allocare e riempire le strutture dati necessarie. Fatto questo, la funzione LayoutMenus() dispone fisicamente gli elementi del menù. Quindi il menù può essere "attaccato" ad una finestra con la funzione di Intuition SetMenuStrip(). Come si vede l'utilizzo di GadTools rende rapida e semplice la creazione di questo elemento dell'interfaccia; l'esempio sul CD mostra anche come l'array di strutture NewMenu sia anche molto "leggibile" e quindi facile da creare e modificare.

Una volta che il menù è stato attaccato ad una finestra, l'utente è in grado di selezionare da esso un'opzione; quindi Intuition ci manderà un IntuiMessage di classe IDCMP_MENUPICK e codice un numero che identifica l'elemento del menù. Lo stesso IntuiMessage può riportare la selezione di più opzioni, perché, sebbene molti utenti forse non lo sanno, è possibile selezionare più opzioni in una volta, tenendo premuto il tasto destro e cliccando sugli elementi con il sinistro.

Siamo giunti alla fine anche di questa lezione. Ma non disperate: saremo di nuovo qui con voi dopo le vacanze estive!

Tabella 1: I tipi di gadget GadTools
BUTTON_KIND Il classico pulsante.
STRING_KIND Per l'immissione di una stringa di testo.
INTEGER_KIND Per l'immissione di un numero.
CHECKBOX_KIND Per elementi di tipo acceso/spento; hanno l'aspetto grafico di caselline che possono essere "spuntate" con un click del mouse.
MX_KIND I cosiddetti radio button, pulsanti dei quali uno solo alla volta può essere selezionato (mutualmente esclusivi); usati per scegliere un'opzione tra tante.
CYCLE_KIND Pulsante ciclico, per selezionare una tra un piccolo numero di possibilità.
SLIDER_KIND Per indicare un livello all'interno di un intervallo (ad esempio il volume dell'audio, ecc.).
SCROLLER_KIND Barra di scorrimento, per scorrere una lista o un'area di schermo.
LISTVIEW_KIND Lista scorrevole di testo; per selezionare una o più opzioni tra tante altre, o per mostrare una lunga lista di cose.
PALETTE_KIND Tavolozza per selezionare un colore.
TEXT_KIND Mostra un testo.
NUMBER_KIND Mostra un numero.

Torna al sommario

Copyright (C) 1999-2002, la redazione di AmigaLife.
Il logo e le copertine della rivista sono tratti dal sito Pluricom e sono Copyright (C) 1992-2001 Pluricom S.r.l.