Newsgroup: it.comp.lang.visual-basic
Titolo: Chi mi corregge questo programma? (API FloodFill)

Ciao a tutti,
Dò per scontato che troverete mille imperfezioni o sbagli nel mio
piccolo programma, ma tenete presente che è solo a scopo didattico
(cioè sto cercando di imparare qualcosa). Quindi vi prego di
concentrarvi sull'API e di dirmi perchè diavolo la funzione non
funziona (scusate il gioco di parole). Nelle intenzioni il programma
dovrebbe essere una specie di emulatore di paint, e la FloodFill mi
serve per emulare lo strumento "secchio di vernice". Spero tanto che
mi possiate aiutare.
Grazie.
Francesco.
 Dim XP, YP, mUp As Integer
 Dim comando As Integer
 Dim colore As Variant
 Private Declare Function FloodFill Lib "gdi32" (ByVal hdc As Long,
ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
 
Private Sub Command1_Click()
comando = 1
End Sub
Private Sub Command2_Click()
comando = 3
End Sub
Private Sub Command3_Click()
comando = 4
End Sub
Private Sub Command4_Click()
comando = 5
End Sub
Private Sub Command5_Click()
comando = 2
End Sub
Private Sub Form_Load()
Picture1.Scale (-320, 100)-(320, -100)
For x = 0 To 15
Picture2(x).BackColor = QBColor(x)
Next x
SavePicture Picture1.Image, "temp00.bmp"
End Sub
Private Sub Form_Unload(Cancel As Integer)
Kill "temp00.bmp" 'cancella il file temporaneo
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x
As Single, y As Single)
XP = x 'queste due righe memorizzano le coordinate
YP = y       'in cui è stato cliccato col mouse
mUp = 0
Picture1.Picture = LoadPicture("temp00.bmp")
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x
As Single, y As Single)
If mUp = 1 Then Exit Sub
Select Case comando
Case Is = 1
Picture1.Cls
Picture1.Line (XP, YP)-(x, y), colore
Case Is = 2
Picture1.Cls
raggio = Sqr(((x - XP) ^ 2) + ((y - YP) ^ 2))
Picture1.Circle (XP, YP), raggio, RGB(255, 0, 0)
Case Is = 3
Picture1.Cls
Picture1.Line (XP, YP)-(x, y), colore, B
Case Is = 4
Picture1.Cls
Picture1.Line (x - 7, y - 7)-(x + 7, y + 2), colore, B
Picture1.Line (x - 5, y - 5)-(x + 5, y + 1), colore, BF
Case Is = 5
End Select
End Sub
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, x As
Single, y As Single)
mUp = 1 ' questo contatore segnala che è stato disegnato
        ' qualcosa alla procedure MouseMove cosi da non
        ' farlo cancellare immediatamente
 
Select Case comando
Case Is = 1
Picture1.Line (XP, YP)-(x, y), colore
Case Is = 2
raggio = Sqr(((x - XP) ^ 2) + ((y - YP) ^ 2))
Picture1.Circle (XP, YP), raggio, colore
Case Is = 3
Picture1.Line (XP, YP)-(x, y), colore, B
Case Is = 5
Picture1.DrawStyle = 5
FloodFill Picture1.hdc, x, y, colore
 
End Select
Picture1.DrawStyle = 0
SavePicture Picture1.Image, "temp00.bmp"  'salva su un file
                        'l'ultima immagine realizzata
End Sub
Private Sub Picture2_Click(Index As Integer)
colore = Picture2.Item(Index).BackColor
Picture6.BackColor = colore
End Sub

L'API è giusta, solo che qualsiasi API del GDI funziona solo su ScaleMode=3
' vbPixel
Tu imposti Picture1.Scale (-320, 100)-(320, -100) , e la proprietà
Picture1.ScaleMode ti diventa = 0, ovvero su coordinate utente. In questo
modo nessuna API grafica avrà effetto
Fabio

 wrote:
Innanzitutto grazie. Poi:
Come c**** facevo a saperlo? non sta scritto da nessunissima parte! A
parte questo: ancora non funziona, nonostante abbia eliminato la Scale
e ora sia su 3. Come devo fare??? Sto impazzendo!!!
Francesco.


 e ora sia su 3. Come devo fare??? Sto impazzendo!!!
Non ho mai usato la FloodFill quindi per l'api specifica non so aiutarti.
Controlla bene i parametri di ingresso della funzione (magari vuole un'array
di punti che definisce il poligono)
Rimane il vincolo con ScaleMode = vbPixel ma non sono sicuro sui parametri
dell'API. controlla bene cos'č che vuole.. il problema senz'altro č li
Fabio

Non avete idea di quanto è frustrante non riuscire neanche dopo tanti
tentativi!!! :-(((((
sappiamo sappiamo, è capitato a tutti ...anzi.. capita anche ora per
fortuna, altrimenti smetterei :))
Fabio