12.06.2013 Views

1 - Amiga Magazine Online

1 - Amiga Magazine Online

1 - Amiga Magazine Online

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!