La creazione di un progetto da zero in Visual Basic NET? Lo trovi su Opentraining.it Visual Basic Italia
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:

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _
x As Single, y As Single)
If Button = vbLeftButton Then
ButtonDown = Button
.
.
.

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:

Dim ButtonDown As Variant

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:

Dim ButtonDown As Variant
Option Explicit

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _
x As Single, y As Single)
If Button = vbLeftButton Then
ButtonDown = Button

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:

Picture1.ForeColor = vbRed

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:

Picture1.DrawWidth = 1

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:

Dim XDown As Double
Dim YDown As Double

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:

XDown = x
YDown = y

Facciamo ora un breve riepilogo del nostro programma, tanto per avere le idee più chiare:

Dim ButtonDown As Variant
Dim XDown As Double
Dim YDown As Double
Option Explicit

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _
x As Single, y As Single)
If Button = vbLeftButton Then
ButtonDown = Button
Picture1.ForeColor = vbRed
Picture1.DrawWidth=1
XDown = x
YDown = y

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:

Timer1.Enabled = True

Infine chiudiamo l'If e la sottoprocedura aggiungendo al codice:

End If
End Sub

e riassumiamo per l'ultima volta l'evento Picture1_MouseDown vedendo così cosa c'è venuto fuori:

Dim ButtonDown As Variant
Dim XDown As Double
Dim YDown As Double
Option Explicit

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _
x As Single, y As Single)
If Button = vbLeftButton Then
ButtonDown = Button
Picture1.ForeColor = vbRed
Picture1.DrawWidth=1
XDown = x
YDown = y
Timer1.Enabled = True
End If
End Sub

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:

Private Sub Picture1_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If ButtonDown = vbLeftButton Then

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:

XDown = X
YDown = Y

Infine chiudiamo la sottoprocedura e l'If con lo stesso metodo di prima e vediamo come si presenta il codice fin qui:

Dim ButtonDown As Variant
Dim XDown As Double
Dim YDown As Double
Option Explicit

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _
x As Single, y As Single)
If Button = vbLeftButton Then
ButtonDown = Button
Picture1.ForeColor = vbRed
Picture1.DrawWidth=1
XDown = x
YDown = y
Timer1.Enabled = True
End If
End Sub
Private Sub Picture1_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If ButtonDown = vbLeftButton Then
XDown = X
YDown = Y
End If
End Sub

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:

Private Sub Picture1_MouseUp(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If ButtonDown = vbLeftButton Then
Timer1.Enabled = False
End If

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:

Private Sub Timer1_Timer()
Dim zz As Integer
Dim ww As Integer
Dim jj As Integer

Teniamo sempre conto del caso ButtonDown = vbLeftButton:

If ButtonDown = vbLeftButton Then

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):

zz = 20 * Rnd
ww = 20 * Rnd
jj = 20 * Rnd

E adesso, come ultima cosa disegnamo i punti utilizzando il metodo PSet ed i valori assunti intervallo per intervallo dalle variabili zz, ww, jj:

Picture1.PSet (XDown + zz, YDown + ww)
Picture1.PSet (XDown - ww, YDown + zz)
Picture1.PSet (XDown + zz, YDown - ww)
Picture1.PSet (XDown - ww, YDown - zz)
Picture1.PSet (XDown + jj, YDown + ww)
Picture1.PSet (XDown - ww, YDown + 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
E-mail:
vbitalia@libero.it <% =Now %>