You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
a individuare l'evento (è il caso del gadget di chiu-<br />
sura della finestra, che quando attivato invia un<br />
messaggio di classe IDCMP-CLOSEWINDOW che<br />
non necessita di ulteriori indicazioni). Quando in-<br />
vece la stessa classe comprende eventi diversi, il<br />
codice permette di distinguerli in maniera più detta-<br />
gliata (l'interpretazione dei valori di codice dipende<br />
dalla classe: per esempio, codici ASC per<br />
IDCMP-VANILLAKEY). Infine, il qualficatore ripor-<br />
ta lo stato dei tasti modificatori (maiuscole, alt, con-<br />
trol, amiga) nel momento in cui l'evento è stato ge-<br />
nerato, e l'indirizzo è relativo a un qualche oggetto<br />
di Intuition (dipende dalla classe per esempio, alla<br />
classe IDCMP-GADGETUP corrisponde l'indirizzo<br />
del gadget selezionato).<br />
Le funzioni che E fornisce per ottenere queste<br />
informazioni sono:<br />
codice := MsgCode()<br />
qualificatore := MsgQualifierO<br />
indirizzo := MsgIaddr()<br />
tutte fanno riferimento all'ultimo messaggio ricevuto<br />
da WaitIMessage( ).<br />
Con l'uso di queste funzioni, il ciclo principale di<br />
un programma E che usi Intuition potrebbe essere<br />
così strutturato:<br />
WHILE (classe:=WaitIMessage(£inestra))o<br />
IDCMP-CLOSEWINDOW<br />
SELECT classe<br />
CASE . . . ...<br />
CASE . . . . . .<br />
ENDSELECT<br />
ENDWHILE<br />
Potete ritrovare questa struttura nell'esempio del listato 2.<br />
Funzioni relative al mouse<br />
L'ultimo gruppo di funzioni che esamineremo è dedica-<br />
to alla lettura del mouse. La posizione del puntatore ri-<br />
spetto a una finestra può essere ottenuta tramite:<br />
in cui W è il puntatore alla finestra; le coordinate riportate<br />
sono espresse in termini di punti dello schermo. La lettu-<br />
ra del pulsante sinistro del mouse è invece affidata alla<br />
funzione:<br />
CONST BUFSIZE=GADGETSIZE*3 -> Buffer per i gadget<br />
-> Vogliamo sapere da Intuition:<br />
CONST IDCMP_CLOSEWINDOW=$200, -> - quando l'utente chiude la finestrz<br />
IDCMP_GADGETUP=$40, -> - quando l'utente preme un gadget<br />
IDCMP RAWKEY=$400 -> - quando l'utente preme un tasto<br />
-> La-finestra deve a;ere:<br />
CONST WFLG-CLOSEGADGET=8, -> - il gadget di chiusura<br />
WFLG-DRAGBAR=2 -> - la barra di spostamento<br />
PROC main()<br />
DEF w,class<br />
DEF iflags,wflags<br />
DEF gbuf[BUFSIZE]:ARRAY,next,gad<br />
/* Costruisce i flag con l'OR dei valori definiti */<br />
iflags:=IDCMP-CLOSEWINDOW OR IDCMP-GADGETUP OR IDCMP-RAWKEY<br />
wflags:=WFLG-CLOSEGADGET OR WFLG-DRAGBAR<br />
/* Crea i 3 gadget. Si noti l'uso di gbuf e next */<br />
/* apre la finestra e attende i messaggi */<br />
IF w:=0penW(0,10,500,70,iflags,wflags,'Finestra di E',NIL,l,gbuf)<br />
SetTopaz(8)<br />
WHILE (class:=WaitIMessage(w))~~IDCMPPCLOSEWINDOW<br />
SELECT class<br />
CASE IDCMP-GADGETUP -> E' stato premuto un gadget<br />
gad:=MsgIaddr()<br />
TextF(10,45,'IDCMP~ADGETUP')<br />
TextF(10,55,'qual=$\z\h[4], ind=$\z\h[8] (Gadget\d[l],<br />
flag=\d[3])',<br />
MsgQualifier(),g~d,gad[43],gad[l3])<br />
CASE IDCMP-RAWKEY -> E stato premuto un tasto<br />
TextF(lO,45,'IDCMPWKEY ')<br />
TextF(10,55,'qual=$\z\h[4], code=$\h[4], ind=$\z\h[8]<br />
ENDSELECT<br />
ENDWHILE<br />
CloseW(w)<br />
ENDIF<br />
ENDPROC<br />
istato 2.<br />
MsgQualifier(),MsgCode(),MsgIaddr())<br />
che ritorna TRUE (-1) se il tasto è premuto, FALSE (O) al-<br />
trimenti. È anche possibile attendere la pressione del ta-<br />
sto sinistro con una chiamata a:<br />
che può tornare utile in molti semplici casi. Per finire, E<br />
mette a disposizione una funzione di basso livello (non<br />
tiene conto di Intuition, ma si limita a leggere i registri<br />
hardware) per interrogare lo stato di entrambi i tasti del<br />
mouse. Si tratta di:<br />
che ritorna una maschera binaria: il bit O indica il tasto si-<br />
nistro, il bit 1 il tasto destro e il bit 2 (I1eventuale) tasto<br />
centrale. Attenzione, però: questa funzione non dovrebbe<br />
essere usata in programmi "normali", a meno di non ri-<br />
nunciare al corretto multitasking di <strong>Amiga</strong>OS.<br />
Per questo mese ci fermiamo qui: nell'attesa della prossi-<br />
ma puntata, in cui parleremo di eccezioni e allocazione<br />
dinamica, potete provare a realizzare un semplice pro-<br />
gramma di disegno usando le funzioni che abbiamo vi-<br />
sto. Buon divertimento! A<br />
l