Laboratorio di Interfacce Grafiche
Esercizio 1 (XForms prima parte)
Il punto A contiene esercizi facili (si tratta di modificare i file visti a
lezione), il punto B e' piu' difficile.
Ovviamente non e' necessario fare tutto...
Usare base di partenza i sorgenti degli esempi visti a lezione:
yesno.c (yes/no senza callback),
yncallbk.c (yes/no con
callback),
demo05.c (lo slider),
nonche'
makefile.
Punto A
-
Cambiare alcuni parametri: parametri della finestra (tipo di
bordo...), parametri degli oggetti (tipo di bottone, tipo di slider,
attributi...)
-
Riscrivere mediante callback l'esempio dello slider.
-
Realizzare un bottone che ogni volta che viene cliccato cambia la
sua etichetta (per es. mostrando ogni volta il numero di volte
che e' stato cliccato finora).
-
Come sopra, ma contando alla rovescia da un numero fissato,
e quando arriva a zero il programma termina.
-
Modificare l'esempio dello slider includendo visualizzazione
dei valori estremi dello slider oltre che del valore correntemente
selezionato.
-
Realizzare un bottone che si comporta in modo diverso a seconda che
sia cliccato col tasto sinistro, destro o centrale del mouse.
Punto B
Provare a realizzare un'applicazione "calcolatrice" analoga a quella
dell'esercizio 0. Si riporta qui la descrizione per comodita'.
NOTA: puo' essere utile utilizzare il
form designer per costruire
l'interfaccia.
La "calcolatrice" gestisce numeri
naturali con due operazioni: addizione e moltiplicazione.
L'interfaccia consistera' in una form con:
- 10 tasti per le 10 cifre numeriche, realizzati come semplici bottoni
- due tasti per le due operazioni, realizzati come semplici bottoni
- un tasto "uguale" per invocare l'esecuzione dell'operazione,
realizzato come semplice bottone
- un display per visualizzare gli operandi e il risultato,
realizzato come box
Le variabili interne del programma saranno (almeno):
- due operandi n1, n2 (numeri interi)
- un operatore op
(costante simbolica corrispondente ad una delle due operazioni)
L'interazione tipica avviene cosi':
-
L'utente introduce un numero cifra per cifra, l'interfaccia
mostra nel display il numero man mano che si forma (chiamo FASE A questa
fase).
-
Poi l'utente introduce un operatore, il display rimane inalterato,
il numero correntemente mostrato sul display diventa il primo operando
n1, l'operatore appena introdotto diventa l'operatore op.
-
Poi un altro numero cifra per cifra, l'interfaccia
mostra nel display il numero man mano che si forma (chiamo FASE B questa
fase).
-
A questo punto l'utente deve selezionare il tasto "uguale"
(selezionare un operatore genera errore),
il numero correntemente mostrato sul display diventa il secondo operando
n2, viene effettuata l'operazione (n1 op n2),
il risultato viene mostrato sul display.
-
Si ritorna al passo 1.
Le callback associate ai vari dispositivi dovranno quindi agire
come segue:
-
La callback di un tasto "cifra" modifica il valore di
n1 o di n2 (a seconda che siamo nella fase A o B),
e aggiorna il contento del display con il nuovo valore di n1 o
n2.
-
La callback di un tasto "operazione" prima controlla che siamo
nella fase A, in caso affermativo assegna l'operatore op, e
passiamo nella fase B con n2=0.
-
La callback del tasto "uguale" prima controlla che siamo nella fase B,
in caso affermativo esegue l'operazione,
aggiorna il contento del display con il risultato dell'operazione, e
torniamo nella fase A con n1=0.
NOTE / SUGGERIMENTI:
-
Quando l'applicazione parte, siamo nella fase A con n1=0.
-
L'aggiornamento di n1 o n2 in seguito ad una nuova
cifra c avviene secondo la formula: n = n*10+c.
-
Il modo piu' facile per trasformare un numero nella stringa corrispondente
(da visualizzare sul display) e' "stamparlo" su una stringa con sprintf.
-
La pressione di un tasto "operazione" o del tasto "uguale" non e' sempre
un'azione valida.
Lo stato di non validita' si puo' gestire o producendo un
messaggio di errore se il tasto viene selezionato,
oppure disabilitando il tasto.
Per indicazioni su come si disabilita/riabilita un oggetto, si usano le
funzioni fl_activate_object(oggetto),
fl_deactivate_object(oggetto), vedere anche
dispense.