Telefonino.net network
 
| 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 » |

Torna indietro   WinTricks Forum > Software > Programmazione

Notices

Rispondi
 
Strumenti discussione
Vecchio 21-11-2003, 22.36.47   #1
[M@RmOtT@]
Newbie
 
Registrato: 21-11-2003
Messaggi: 1
[M@RmOtT@] promette bene
Mouse in Pascal

Salve a tutti, ho un problema in Turbo Pascal: utilizzare il mouse in ambiente grafico. Non sono molto abile nella programmazione, e questo problema mi fa impazzire . Ciò che vorrei realizzare è una specie di pulsante. Se qualcuno trovasse il tempo di aiutarmi gli sarei davvero grato. Grazie in anticipo
[M@RmOtT@] non è collegato   Rispondi citando
Vecchio 22-11-2003, 13.35.40   #2
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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                   ...**...........
Avrai sicuramente già intravisto la sagoma del mouse risultante.
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
La parte teorica a questo punto è praticamente conclusa, vediamo come metterla in pratica:
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
LoryOne non è collegato   Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

Orario GMT +2. Ora sono le: 12.15.41.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.