Connessione al database con Visual Basic NET? Lo trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
LA FUNZIONE EXTFLOODFILL (Tutorial completo)

Attraverso l'API ExtFloodFill è possibile riempire un'area chiusa col colore prescelto.
Per determinare l'area è necessario creare tale area. Questo può essere fatto ad esempio attraverso l'uso di una penna: utilizzare la ExtFloodFill su un controllo PictureBox vuoto può infatti portare al totale riempimento del controllo. Nel corso dell'articolo comunque vedremo quest'aspetto più nel dettaglio.
Nel frattempo ecco di seguito la dichiarazione della funzione:

Declare Function ExtFloodFill Lib "Gdi32" (ByVal hdc As Long, ByVal X As _
Long, ByVal Y As Long, ByVal crColor As Long, ByVal wFillType As Long) As _
Long

Come al solito la funzione ritorna il valore 0 in caso di fallimento ed un valore diverso dallo zero in caso di successo.

I parametri della ExtFloodFill sono i seguenti:

hdc E' il riferimento al controllo. Per riferirsi a Form1 basterà impostare hdc come Form1.hdc, mentre per quanto riguarda Picture1 si può impostare Picture1.hdc;
X Specifica la coordinata orizzontale dalla quale partire per riempire l'area;
Y Specifica la coordinata verticale dalla quale partire per riempire l'area;
crColor Indica il colore del bordo o dello sfondo all'area da riempire. Colore che dev'essere indicato con il codice RGB. Questo parametro dev'essere inserito soltanto dopo essersi fatti un'idea di quale operazione definita dal parametro wFillType utilizzare;
wFillType Questo parametro dev'essere rappresentato da uno dei seguenti valori, che descrivono l'operazione da compiere sull'area specificata:
FLOODFILLBORDER l'area di riempimento è limitata dal colore indicato nel parametro crColor. Così partendo all'interno di un'area il cui contorno è nero, tale area verrà riempita finchè il colore di riempimento, espandendosi, non troverà il bordo nero. Se non c'è bordo o il bordo è di un colore diverso allora tutta l'area di disegno sarà riempita col colore;
FLOODFILLSURFACE l'area di riempimento è definita non più dal bordo ma dal colore dell'area stessa, come indicato dal parametro crColor. Così se si indica nel parametro crColor un codice che corrisponde al blu, il riempimento dell'area proseguirà finchè non s'incontrerà un colore differente dal blu

Naturalmente, siccome crColor non si riferisce al colore col quale verrà riempita l'area, il problema viene risolto attraverso il metodo FillColor. FillColor indicherà dunque quale tonalità di colore utilizzare nell'operazione di riempimento dell'area.
Facciamo un esempio.
Vogliamo disegnare una linea alla pressione del tasto sinistro del mouse e poi riempire le aree chiuse così create attraverso la pressione del tasto destro del mouse.
Apriamo un nuovo progetto EXE Standard nel quale trascineremo un controllo PictureBox.
Andiamo innanzitutto a dichiarare le variabili che c'interessano e naturalmente la funzione ExtFloodFill:

Declare Function ExtFloodFill Lib "Gdi32" (ByVal hdc As Long, ByVal X As _
Long, ByVal Y As Long, ByVal crColor As Long, ByVal wFillType As Long) As _
Long
Dim X1, Y1 As Single
Dim Disegna As Boolean

Nell'evento Load di Form1 impostiamo le proprietà della PictureBox in modo da chiarirci sui parametri da immettere ogniqualvolta vogliamo disegnare su un controllo di questo tipo. Chiudiamo la sottoprocedura con End Sub:

Private Sub Form_Load()
Picture1.DrawWidth = 3
Picture1.FillStyle = vbSolid
Picture1.ScaleMode = 3
Picture1.FillColor = vbBlack
End Sub

Adesso nell'evento MouseDown di Picture1 inseriamo il codice che indica l'eventualità nella quale l'utente prema sul controllo Picture1 il tasto sinistro del mouse. Verranno in questo caso memorizzate le coordinate del punto di Picture1 sul quale si è cliccato, coordinate di partenza per andare a disegnare la linea nell'evento MouseMove di Picture1. Indichiamo infine che in quest'eventualità la variabile Booleana 'Disegna' prende il valore True e quindi che si può cominciare a disegnare la linea:

Private Sub Picture1_MouseDown(Button As Integer, Shift As _
Integer, X As Single, Y As Single)
Disegna = 1
If Button = vbLeftButton Then
X1 = X
Y1 = Y
End If

Sempre all'interno dello stesso evento vediamo il codice nel caso in cui il tasto premuto sia quello destro, per cui si attiva il riempimento dell'area. Iniziamo col calcolare un codice di colore RGB casuale da applicare all'area da riempire. In secondo luogo richiamiamo la funzione ExtFloodFill. Chiudiamo infine la sottoprocedura con End Sub:

If Button = vbRightButton Then
Picture1.FillColor = RGB(Int(Rnd * 255), Int(Rnd * 255), Int _
(Rnd * 255))
ExtFloodFill Picture1.hdc, X, Y, RGB(0, 0, 0), FLOODFILLBORDER
End If
End Sub

Impostando in questo modo la ExtFloodFill abbiamo indicato che l'oggetto sul quale disegnare è Picture1, che il punto di partenza è il punto (di coordinate X ed Y) sul quale si è cliccato col tasto destro del mouse e soprattutto che l'operazione di riempimento deve proseguire finchè non viene incontrato un bordo nero (rappresentato dalla linea che andiamo a tracciare che è di colore nero, e che rappresenta appunto il bordo dell'area).
Sviluppiamo ora il codice per l'evento MouseMove: partendo proprio dal punto nel quale si era cliccato col tasto sinistro del mouse, per ogni punto sul quale si posiziona il puntatore, verrà disegnato un punto (o meglio una linea):

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
If Disegna = True Then
Picture1.Line (X1, Y1)-(X, Y)
X1 = X
Y1 = Y
End If
End If
End Sub

Arriviamo così al termine dell'applicazione: quando uno dei due tasti del mouse (a noi a dire il vero interessa in questo caso solamente il sinistro) viene rilasciato, si interrompe l'operazione di disegno della linea:

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Disegna = False
End Sub

L'esempio è terminato. Se adesso si traccia una linea chiusa sul controllo PictureBox tenendo premuto il tasto sinistro del mouse e successivamente si clicca col tasto destro su un punto interno all'area così determinata, si potrà apprezzare l'operazione di riempimento tramite un colore determinato in maniera casuale dell'area in questione, proprio come nella figura sottostante:


Presemtiamo infine qui di seguito il codice completo dell'esempio:

Private Declare Function ExtFloodFill Lib "Gdi32" (ByVal hdc As Long, ByVal _
X As Long, ByVal Y As Long, ByVal crColor As Long, ByVal wFillType As Long) As _
Long
Dim X1, Y1 As Single
Dim Disegna As Boolean
Private Sub Form_Load()
Picture1.DrawWidth = 3
Picture1.FillStyle = vbSolid
Picture1.ScaleMode = 3
Picture1.FillColor = vbBlack
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X _
As Single, Y As Single)
Disegna = 1
If Button = vbLeftButton Then
X1 = X
Y1 = Y
End If
If Button = vbRightButton Then
Picture1.FillColor = RGB(Int(Rnd * 255), Int(Rnd * 255), Int(Rnd * 255))
ExtFloodFill Picture1.hdc, X, Y, RGB(0, 0, 0), FLOODFILLBORDER
End If
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X _
As Single, Y As Single)
If Button = vbLeftButton Then
If Disegna = True Then
Picture1.Line (X1, Y1)-(X, Y)
X1 = X
Y1 = Y
End If
End If
End Sub
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X _
As Single, Y As Single)
Disegna = False
End Sub



Archivio:ndexed
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