INPUT FIELDS Per introdurre testo, che puo' essere editato usando la tastiera. Per aggiungere un input field nella form corrente: FL_OBJECT * fl_add_input(,x,y,w,h,); = costante simbolica (FL_NORMAL_INPUT...) x,y,w,h = coordinate dell'angolo in basso a sx (in pixel, nel sistema di riferimento della form), larghezza e altezza (in pixel) = stringa che viene mostrata a lato del campo di inserimento Per default, il campo di inserimento all'inizio e' vuoto. Per specificare un contenuto iniziale: fl_set_input(,); Per leggere la stringa inserita:   char * fl_get_input(); MENU' In XForms, un menu' appare normalmente come una box con un'etichetta (titolo del menu') al centro. Quando l'utente si posiziona col mouse su tale box (ed eventualente clicca un tasto) appare una tendina contenente le voci del menu', e l'utente puo' selezionarne una. Aggiungere un menu' alla form corrente: FL_OBJECT * fl_add_menu(,x,y,w,h,); dove x,y,w,h = come al solito = titolo del menu' (che appare sulla box) = uno tra: FL_PUSH_MENU -> la tendina del menu' appare quando l'utente schiaccia un tasto del mouse sulla box, e appare sollevata dallo sfondo e proiettante un'ombra FL_PULLDOWN_MENU -> la tendina del menu' appare quando l'utente schiaccia un tasto del mouse sulla box (come nel caso push down) ma la tendina appare giacente sullo sfondo, senza ombra FL_TOUCH_MENU -> la tendina del menu' appare quando l'utente si muove col mouse nella box (non e' necessario schiacciare tasti) L'istruzione precedente non specifica quali sono le voci del menu'. Queste si assegnano con: fl_set_menu(,); dove contiene le voci del menu' una di seguito all'altra separate da '|', es: "prima|seconda|terza" La fl_add_menu non specifica neanche il tipo di box da usarsi per il titolo del menu' (ne usa una di default), per cambiarla usare: fl_set_object_boxtype(,); Come collegare un'azione a ciascuna voce di un menu': Quando l'utente seleziona una voce di menu' si genera un evento. Se sto gestendo l'interazione senza usare callback (ovvero non ho associato una callback all'oggetto menu') allora in seguito all'evento fl_do_forms esce e ritorna l'oggetto menu' all'interno del quale la voce e' stata selezionata. Altrimenti (ovvero, se l'oggetto menu' ha una callback associata), XForms chiama automaticamente quella callback. In entrambi i casi, serve sapere quale voce e' stata selezionata per decidere come comportarsi. Per farlo si usa la funzione: int fl_get_menu(); ritorna il numero d'ordine della voce selezionata. Esempio: (vedere file menu.c) #include "forms.h" #include void menu_cb(FL_OBJECT *ob, long user_data) { printf("%s\n",fl_get_menu_item_text(ob,fl_get_menu(ob))); switch(fl_get_menu(ob)) { case 1: /* azione corrispondente a prima voce */ break; case 2: /* azione corrispondente a seconda voce */ break; case 3: /* azione corrispondente a terza voce */ break; case 4: exit(0); } } int main(int argc,char *argv[]) { FL_FORM *form; FL_OBJECT *menu; fl_initialize(&argc, argv, "FormDemo", 0, 0); form = fl_bgn_form(FL_UP_BOX,140,100); menu = fl_add_menu(FL_PULLDOWN_MENU,20,20,100,60,"This is a menu"); fl_set_object_boxtype(menu,FL_UP_BOX); fl_set_menu(menu,"one option|another option|a third option|exit"); fl_set_object_callback(menu,menu_cb,0); fl_end_form(); fl_show_form(form, FL_PLACE_MOUSE, FL_TRANSIENT,"FormDemo"); fl_do_forms(); } Altre funzioni utili sui menu': fl_get_menu_text(); --> ritorna la stringa titolo del menu' fl_get_menu_item_text(,k); --> ritorna la stringa che etichetta la voce k-esima fl_get_menu_maxitems(); --> ritorna il numero di voci nel menu Vi sono funzioni per aggiungere/rimuovere una voce, sostituirne l'etichetta. Vi sono funzioni per cambiare l'apparenza e comportamento delle voci. Ogni voce ha un modo tra: FL_PUP_NONE --> default FL_PUP_GREY --> voce non selezionabile, etichetta visualizzata in grigio FL_PUP_BOX --> con quadratino vuoto a fianco (vedere dopo) FL_PUP_CHECK --> con quadratino pieno a fianco (vedere dopo) FL_PUP_RADIO --> con rombetto, inizialmente vuoto, a fianco (vedere dopo) Mediante FL_PUP_BOX e FL_PUP_CHECK si realizzano voci che restano selezionate o disselezionate tra un'apertura e l'altra della tendina. Mediante FL_PUP_RADIO si puo' fare cosa analoga per voci mutuamente esclusive. Per assegnare / leggere il modo corrente di una voce di menu': fl_set_menu_item_mode(,,); fl_get_menu_item_mode(,); Uso di FL_PUP_BOX e FL_PUP_CHECK: Se una voce ha un quadtratino (vuoto o pieno) a fianco, ogni volta che seleziono la voce il quadratino passa da vuoto a pieno e viceversa (ovvero i modi FL_PUP_BOX e FL_PUP_CHECK si scambiano tra loro). Uso di FL_PUP_RADIO: Le voci con un rombetto (FL_PUP_RADIO) costituiscono un gruppo "radio": in ogni istante solo una puo' avere il rombetto pieno, se ne seleziono una il suo rombetto si riempie, e si svuota quello di tutte le altre. Analogo dei gruppi di radio buttons visti in precedenza. CHOICE Un oggetto choice si presenta come un box che mostra al suo interno la scelta corrente. L'utente puo' ciclare tra le scelte possibili usando il tasto sx o centrale del mouse, oppure ottenere la lista completa in forma di menu' usando il tasto destro. Funzionamento molto simile ai menu'. Vedere manuale. SIMBOLI COME ETICHETTE DI OGGETTI Finora abbiamo visto oggetti con etichette testuali. L'etichetta di un oggetto puo' essere un simbolo. XForms ha un insieme di simboli predefiniti. Quando l'etichetta di un simbolo inizia con il carattere '@', XForms capisce che deve essere generato un simbolo e non una stringa. Il resto della stringa etichetta (dopo '@') dice che simbolo deve essere generato, esempi: "@->" : genera freccia che punta a destra "@>" : genera triangolo che punta a destra "@>>" : genera doppio triangolo che punta a destra eccetera Posso anche specificare che un simbolo deve essere ruotato (per es. XFornisce come predefinite solo le frecce a dx e sx, per ottenere quelle verso l'alto e il basso devo adoperare rotazioni. Esempio: (vedere file sym.c) #include "forms.h" FL_FORM *form; FL_OBJECT *readyobj; void create_form_form(void) { FL_OBJECT *obj; form = fl_bgn_form(FL_UP_BOX,470,320); /* bottone invisibile che copre tutta la form: trucco per catturare qualsiasi click avvenga nella finestra */ readyobj = obj = fl_add_button(FL_HIDDEN_BUTTON,0,0,470,320,""); ..... /* freccia verso destra */ obj = fl_add_box(FL_BORDER_BOX,20,120,70,70," @->"); fl_set_object_lalign(obj,FL_ALIGN_BOTTOM); obj = fl_add_box(FL_NO_BOX,20,120,70,70,"@->"); fl_set_object_lcol(obj,FL_MAGENTA); /* freccia ruotata di 90 gradi */ obj = fl_add_box(FL_BORDER_BOX,200,220,70,70," @0090->"); fl_set_object_lalign(obj,FL_ALIGN_BOTTOM); obj = fl_add_box(FL_NO_BOX,200,220,70,70,"@0090"); fl_set_object_lcol(obj,FL_BLUE); ..... fl_end_form(); } int main(int argc, char *argv[]) { FL_OBJECT *obj; fl_initialize(&argc, argv, "FormDemo", 0, 0); create_form_form(); fl_show_form(form,FL_PLACE_CENTER,FL_NOBORDER,NULL); do obj = fl_do_forms(); while (obj!=readyobj); fl_hide_form(form); return 0; } Il programmatore puo' anche creare nuovi simboli per esempio usando pixmap, o usando funzioni di disegno fornite da XForms. BROWSER Oggetto che puo' contenere un numero qualsiasi di linee di testo. Se ne contiene piu' di quante stiano nella dimensione dell'oggetto, XForms aggiunge automaticamente una scroll bar. Tipi di browser: FL_NORMAL_BROWSER --> visualizza semplicemente testo (utile per es. per mostrare messaggi di help all'utente, ved. anche *) FL_SELECT_BROWSER --> permette di selezionare una linea singola FL_HOLD_BROWSER --> come sopra ma la linea resta selezionata fino a che l'utente non ne seleziona un'altra FL_MULTIBROWSER --> permette di selezionare piu' linee contemporaneamente * E' possibile anche inizializzare il contenuto testuale di un browser caricandolo da un file, questo permette ad es. di visualizzare schermate di help caricate da file Per maggiori dettagli si rimanda al manuale