Guide e Tutorials:indexed | ||||||||||||||||||||
Come creare un vaporizzatore Che cos'è un vaporizzatore? Chiunque usi o abbia usato in passato un'applicazione di editing di immagini saprà che il vaporizzatore (chiamato solitamente brush, ossia spazzola) è un particolare effetto grafico che disegna punti casuali su una picturebox proprio come se si utilizzasse una bomboletta spray. Naturalmente la dispersione dei punti non dev'essere casuale ma ristretta ad un campo d'azione, ossia al particolare settore dell'immagine sul quale si punta questa bomboletta di colore virtuale. Un secondo problema da considerare e risolvere è il fatto che l'intensità e la durata dello spruzzo deve variare a seconda della più o meno prolungata pressione sul mouse. Cominciamo con ordine e pazienza Prima di tutto apriamo un nuovo progetto ed inseriamo nel Form una PictureBox di cui manterremo il nome standard di Picture1. Settiamo le caratteristiche di Picture1: sarà per questo necessario impostare la proprietà ScaleMode su 3 ossia Pixel Definiamo adesso l'evento secondo il quale l'utente prema il pulsante sinistro del mouse. In questo caso si avrà l'inizio dello spruzzo del colore ma non sappiamo quanto durerà. L'intensità sarà allora progressiva. Vediamo la prima parte del codice relativa all'evento MouseDown; abilitiamo lo spruzzo solo nel caso in cui sia premuto il tasto sinistro del mouse:
Cosa significa questo? La prima linea di codice definisce la sottoprocedura Picture1_MouseDown, ossia l'eventualità in cui l'utente prema un tasto sulla Picturebox1. La seconda linea definisce invece quale pulsante del mouse è stato premuto. Le costanti del mouse sono vbRightButton per il pulsante destro e vbLeftButton per quello sinistro. Nel nostro caso abbiamo subordinato lo spruzzo del colore alla pressione del tasto sinistro. Ed infatti nella seconda linea di codice troviamo If Button = vbLeftButton. La terza linea ci indica invece che vogliamo memorizzare il pulsante premuto per rendere disponibile la costante del pulsante (vbLeftButton) da tutte le sottoprocedure del programma. Ecco che si pone il primo problema. Come fare a dare una validità generale alla variabile ButtonDown? Dichiararla all'interno della sottoprocedura (in questo caso Picture1_MouseDown) renderebbe il valore di ButtonDown visibile e disponibile solo all'interno di tale sottoprocedura. Per ampliare il raggio di azione della variabile inseriamo la dichiarazione di ButtonDown nelle dichiarazioni generali del Form. Questo indicherà a Visual Basic che la variabile ButtonDown dovrà mantenere il suo valore vbLeftButton in tutto il codice di questo Form. La realizzazione di questo punto è semplice. Basta andare all'inizio del codice del Form e scrivere come prima cosa:
Aggiungendo un bel Option Explicit per obbligarci a dichiarare tutte le variabili (in questo modo non avremo errori di variabili non dichiarate o confiltti di aree di validità delle stesse) vediamo a che punto del nostro programma siamo arrivati:
Fin qui l'utilità del codice è pari a zero! Allora vediamo di andare un pochino avanti. Definiamo il colore e la grandezza dei punti che devono essere disegnati sulla PictureBox. Per impostare il colore possiamo utilizzare a piacere una delle costanti dei colori messe a disposizione da Visual Basic. Ad esempio vbRed, vbBlue, vbGreen, vbWhite e così via. Noi scegliamo ad esempio vbRed immaginando che la bomboletta cha abbiamo in mano sia di colore rosso. Allora scriviamo:
Questo significa che la PictureBox1 è stata impostata in modo tale per cui tutte le aggiunte grafiche che verranno fatte su di essa saranno di colore rosso. Questa specificazione è piuttosto generica e non creata soltanto per il disegno di punti. Ad esempio, impostando come abbiamo fatto Picture1.ForeColor = vbRed, non solo i punti ma anche i cerchi, le linee eccetera, saranno disegnate di rosso. Aggiungiamo adesso la specificazione della dimensione dei punti:
Anche in questo caso DrawWidth non è legato solamente al disegno di punti ma indistintamente a tutti gli elementi grafici che possono essere aggiunti alla PictureBox. In quest'esempio abbiamo deciso di impostare una dimensione pari ad uno. Naturalmente il valore può essere modificato a piacere. A questo punto entriamo in un'area un attimo più complicata: dobbiamo infatti definire le coordinate del punto nel quale agire col nostro vaporizzatore. Le coordinate non possono essere semplicemente X ed Y come definite dall'evento MouseDown in quanto sarebbero valide solo nel caso in cui l'utente prema il pulsante e non ad esempio quando muove il mouse. Anche in questo caso quindi definiamo due coordinate X ed Y generiche la cui dichiarazione deve essere contenuta nelle dichiarazioni generali del Form. Torniamo perciò all'inizio del codice e scriviamo:
mentre all'interno della nostra sottoprocedura Picture1_MouseDown diciamo a Visual Basic che quando l'utente preme per la prima volta il pulsante per attivare lo spray, le coordinate sulle quali viene puntata la bomboletta sono quelle definite momentaneamente dall'evento MouseDown:
Facciamo ora un breve riepilogo del nostro programma, tanto per avere le idee più chiare:
Adesso attiviamo Timer1. Prima di tutto bisogna inserire nel nostro progetto il timer, ossia l'icona a forma di cronometro. Questo ci permetterà di produrre uno spruzzo di colore prolungato nel caso in cui si tenga premuto il pulsante sinistro del mouse. Dunque, importiamo il controllo Timer1 nel progetto e aggiungiamo al codice:
Infine chiudiamo l'If e la sottoprocedura aggiungendo al codice:
e riassumiamo per l'ultima volta l'evento Picture1_MouseDown vedendo così cosa c'è venuto fuori:
Ora passiamo al caso in cui l'utente muova il mouse. Anche l'obiettivo della bomboletta sulla PictureBox deve cambiare. Ecco cosa fare: prima di tutto, per obbligare l'utente a mantenere premuto il tasto sinistro del mouse anche nel muovere quest'ultimo aggiungiamo:
poi ridefiniamo le variabili-coordinate XDown e YDown in modo che il punto dove spruzzare il colore non sia più quello nel quale si è premuto per la prima volta il tasto sinistro del mouse ma quello indicato dal puntatore quando si sposta il mouse sulla PictureBox:
Infine chiudiamo la sottoprocedura e l'If con lo stesso metodo di prima e vediamo come si presenta il codice fin qui:
Adesso definiamo il caso in cui l'utente rilasci il pulsante del mouse. In questo caso l'operazione di colorazione dell'immagine verrà interrotta bloccando il Timer:
Ecco adesso il punto focale di questa trattazione: il Timer. Quando infatti è attivato il colore continua ad essere prodotto. Definiamo allora le variabili della procedura Timer:
Teniamo sempre conto del caso ButtonDown = vbLeftButton:
Definiamo adesso le variabili della dispersione dei punti, ossia le variabili che abbiamo appena dichiarato all'interno della sottoprocedura Timer(). zz, ww, jj assumeranno ad ogni intervallo definito da Timer1 un valore differente compreso tra 1 e 20. L'area di dispersione sarà quindi (1;20):
E adesso, come ultima cosa disegnamo i punti utilizzando il metodo PSet ed i valori assunti intervallo per intervallo dalle variabili zz, ww, jj:
Ed ecco che il nostro vaporizzatore è concluso! Il progetto può essere facilmente scomposto ed utilizzato ad esempio in un editor grafico con un risultato davvero soddisfacente. Ciao a tutti e alla prossima lezione. |
Archivio: | ||||
Lezioni | Commenta questa lezione | Invia la tua guida | Avviso per le nuove lezioni | Proponi un argomento |
Visual Basic Italia© copyright 2000 - tutti i diritti riservati |