Newsgroup: it.comp.lang.visual-basic
Titolo: Fill di Figure Chiuse

Mi sono imbattuto nella necessità di riempire con un colore
arbitrario una figura chiusa romboidale, tracciabile soltanto
col il Metodo Line, un lato alla volta, e che quindi non
consente di riempire tale figura utilizzando FillColor.
In linguaggi ormai defunti da me usati in passato, e probabilmente
in altri linguaggi ancora vivi, c'era la Funzione
         Fill x,y
che, fissato con altra istruzione il colore di riempimento,
riempiva con tale colore la poligonale chiusa arbitraria che
contenesse tale punto, e quindi, in sua assenza, riempiva
tutto lo schermo ad eccezione di altre figure chiuse non
contenenti il punto (x,y).
Si può disporre di qualcosa di analogo in VB ?
Io ho risolto il problema artigianalmente, percorrendo pixel
per pixel le ascisse e tracciando linee oblique da y1 a y2.
Metodo però difficilmente generalizzabile a figure chiuse
qualsiasi, anche curve.  Già nel caso di un rombo i cui
lati siano obliqui rispetti ad entrambe le ordinate, occorre,
per il Filling calcolare le equazioni dei lati e tracciare
linee oblique o anche orizzontali o verticali tra i punti
giacenti sui lati.
Se ci fosse qualche funzione Api che queste cose se le fa
da sè sarebbe meglio per tutti, ritengo.
Ringrazio poer l'attenzione.
ramarro.

Mi sono imbattuto nella necessità di riempire con un colore
arbitrario una figura chiusa romboidale, tracciabile soltanto
col il Metodo Line, un lato alla volta, e che quindi non
consente di riempire tale figura utilizzando FillColor.
In linguaggi ormai defunti da me usati in passato, e probabilmente
in altri linguaggi ancora vivi, c'era la Funzione
         Fill x,y
che, fissato con altra istruzione il colore di riempimento,
riempiva con tale colore la poligonale chiusa arbitraria che
contenesse tale punto, e quindi, in sua assenza, riempiva
tutto lo schermo ad eccezione di altre figure chiuse non
contenenti il punto (x,y).
Si può disporre di qualcosa di analogo in VB ?
Io ho risolto il problema artigianalmente, percorrendo pixel
per pixel le ascisse e tracciando linee oblique da y1 a y2.
Metodo però difficilmente generalizzabile a figure chiuse
qualsiasi, anche curve.  Già nel caso di un rombo i cui
lati siano obliqui rispetto ad entrambe le ordinate, occorre,


 lati siano obliqui rispetti ad entrambe le ordinate, occorre,


arbitrario una figura chiusa romboidale, tracciabile soltanto
Ho usato più volte questa procedura:
Public Declare Function DeleteObject& Lib "gdi32" (ByVal hObject As
Long)
Public Declare Function FloodFill Lib "gdi32" (ByVal hdc As Long,
ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Public Declare Function SelectObject& Lib "gdi32" (ByVal hdc As Long,
ByVal hObject As Long)
Public Declare Function CreateSolidBrush& Lib "gdi32" (ByVal crColor
As Long)
Public Sub VersaColore(ByVal clr As Long, x As Single, y As Single)
    Dim hBrush As Long      '// Handle del brush
    Dim res As Long         '// Valore di ritorno di FloodFill
    '// Creaiamo un brush con sfondo uniforme (cioè senza quadrati,
linee, ecc.)
    hBrush = CreateSolidBrush(clr)
    '// Selezioniamo il brush creato nel nostro Device context
    SelectObject frmDisegno.pctDisegno.hdc, hBrush
    '// Ora chiamiamo la funzione
    res = FloodFill(frmDisegno.pctDisegno.hdc, x, y, vbBlack)
    '// E ora, importantissimo, distruggiamo l'oggetto.
    DeleteObject hBrush
End Sub

 consente di riempire tale figura utilizzando FillColor.
Traccia la figura chiusa adoperando l'api Polygon ed imposta la proprietą
FillStyle e FillColor della Picturebox (o form o printer) sul valore
desiderato.
=========================
Fabio Guerra
VB Developer
Pordenone - Italy
E-mail : 
fabi...@iol.it
Web: 
http://www.thopos.com/
=========================


