|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
21-11-2003, 22.36.47 | #1 |
Newbie
Registrato: 21-11-2003
Messaggi: 1
|
Mouse in Pascal
|
22-11-2003, 13.35.40 | #2 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Il far apparire il mouse sullo schermo ed in un secondo momento saperlo gestire, è un' operazione che richiede una minima conoscenza del linguaggio Assembly.
Il buon vecchio DOS viene in aiuto predisponendo registri, interrupt e funzioni atte allo scopo di predisporre la maschera (forma e dimensioni), ricavare la posizione del cursore sullo schermo (coordinate x,y espresse in pixels in modalità grafica oppure riga,colonna in modalità testo) ed infine di conoscere lo stato dei pulsanti (se premuti oppure no). La tua procedura si articola essenzialmente in tre fasi 1) Definizione maschera 2) Predisposizione modalità (grafica/testo) e visualizzazione del cursore 3) Gestione posizione e stato dei tasti Ora, in Windows i programmatori Microsoft hanno predisposto nelle API tutta una serie di funzioni già pronte all'uso per assolvere ai compiti sopra descritti, mentre in DOS il discorso è un po più complesso ma comunque fattibile. Diciamo subito che prima di procedere devi acquisire (se le sai già tanto meglio) le seguenti conoscenze: 1) Cos'è un registro 2) Cos'è un interrupt 3) Cos'è un indirizzo (suddiviso in segment ed offset) Riporto una lista di funzioni DOS che ti sono necessarie: Se in AX poni 0h otterrai mouse reset Se in AX poni 1h otterrai cursor enable Se in AX poni 2h otterrai cursor disable Se in AX poni 3h otterrai get mouse position e button status Se in AX poni 4h otterrai set mouse position Se in AX poni 5h otterrai get button press information Se in AX poni 6h otterrai get button release information Se in AX poni 7h otterrai set min and max horizzontal position Se in AX poni 8h otterrai set min and max vertical position Se in AX poni 9h otterrai set grafic cursor block Se in AX poni 0Ah otterrai set text cursor Se in AX poni 0Bh otterrai read motion counters Se in AX poni 0Ch otterrai set user-defined routnes Se in AX poni 0Dh otterrai enable light pen emulation Se in AX poni 0Eh otterrai set disable light pen emulation Se in AX poni 0Fh otterrai set mouse pixel/ratio Se in AX poni 10h otterrai window conditional off Se in AX poni 12h otterrai set large graphic cursor Se in AX poni 13h otterrai set speed threshold Ricorda che per rendere effettive le modifiche dovrai sempre ricorrere all'interrupt 33h. (Basta che tu abbia installato nel config.sys il gestore del mouse all'avvio del PC altrimenti niente da fare) La lista è una serie di funzioni il cui comportamento è così regolato: 1) Immetti la funzione 2) Richiama il giusto interrupt 3) Ricava i valori di ritorno dai registri preposti a contenerli in base alla funzione impostata Ovviamente se la funzione è ad esempio 0h oppure 1h, il risultato è immediato e non vi è nessun valore di ritorno (punto 3 inutile) Passiamo ora a spendere qualche parola sulla maschera del cursore. La maschera o forma non è altro che una matrice di bit che in questo esempio (matrice di 16x16 bit) potrebbe assomigliare a: Codice:
bit nella screen mask bit nella cursor mask bit risultante 1011111111111111 0100000000000000 .*.............. 1001111111111111 0110000000000000 .**............. 1000111111111111 0111000000000000 .***............ 1000011111111111 0111100000000000 .****........... 1000001111111111 0111110000000000 .*****.......... 1110011111111111 0001100000000000 ...**........... 1110011111111111 0001100000000000 ...**........... Per capire il perchè devi conoscere l'algebra booleana secondo la quale: Codice:
bit nella screen mask bit nella cursor mask bit risultante 0 0 0 0 1 1 1 0 stesso colore 1 1 colore invertito Visto che devi utilizzare Pascal, allora si potrebbe pensare di definire la maschera in questo modo: const v : array [0..31] of word ={$fc7f,$fc7f,$fc7f,$e00f,$e00f,$e00f,$fc7f,$fc7f, $fc7f,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff} ($ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff, $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff, $0000,$0100,$0100,$0fe0,$0100,$0100,$0100,$0100, $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000); Ora è necessaria un altro po di teoria. Una volta defintia la maschera, questa deve essere gestita in modo tale da essere visualizzata sullo schermo con la sagoma da noi definita. Come procedere: 1) Immettere la funzione metti in AX 9h (vedi sopra->Set graphic cursor block) metti in BX 7h cursor x hot spot metti in CX 4h cursor y hot spot metti in ES:[DX] address of mask (significa il segmento in ES e l'offset in DX) 2) Richiamare l'interrupt 33h Vediamo a lato pratico: Uses Dos; Var reg:registers; Imposti la modalità grafica, poi PROCEDURE Mouse(ax : word); Begin reg.AX:=ax; intr($33,reg) End; Resetti il mouse con un bel Mouse(0), poi With reg Do Begin BX:=7; CX:=4; ES:=Seg(v); BX:=Ofs(v) End; ed infine mostri il mouse sullo schermo con Mouse(9). A questo punto il 60% del programma è svolto. Credo di averti aiutato nella sezione più complessa del programma ma manca la parte relativa alla gestione dei tasti e della posizione del cursore sullo schermo. In verità sei molto vicino alla soluzione di questa ultima parte. Cerca con Google come fare per ricavare le coordinate x ed y del cursore, nonchè lo stato dei tasti. Dagli esempi che ricaverai capirari il perchè della lista che ho riportato. Quando avrai acquisito il metodo, l'ultima parte la si potrà considerare sotto questo aspetto: Una volta creato il pulsante sullo schermo, alla pressione del tasto si dovrà verificare che le coordinate x ed y del mouse siano all'interno del rettangolo che contiene il pulsante. In caso affermativo, l'utente avrà premuto sul pulsante (evento Command1_Click()) PROGRAMMARE E' UN'ARTE. Buon lavoro. Ciao |
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|