Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Riempimento di colore

Salve,
sono di nuovo qui a rompere le scatole con problemi reltivi ai metodi
grafici.
Vorrei poter disegnare sulla porzione di una form un poligono e poi
colorarlo internamente. Con una versione Dos di VB (VBdos), trovato
all'universita', riuscivo a fare questo (ovviamente non su form, ma il
procedimento e' analogo) costruendo il poligono "a mano", mediante varie
istruzioni "line". Poi usavo una funzione "paint", i cui parametri salienti
sono:
PAINT (x,y) , [colore], [colore_bordo] dove
- colore e' il colore con cui riempire la figura (che deve essere chiusa)
-colore_bordo e' il colore del bordo della figura.
La stessa funzione (per me comodissima) non esiste in VB6. Le uniche figure
che riesco a disegnare "colorate" sono i cerchi, le ellissi ed i rettangoli.
Cercando nell'help e in MSDN in rete, non trovo nulla di analogo (i vari
FillColor e FillStyle mi servono a poco). Non esiste una funzione analoga a
paint?
Ho visto che alcune funzioni disponibili nella libreria gdi32.dll permettono
di disegnare poligoni e figure irregolari, anche se non si parla di figure
riempite di colore. Questa libreria e' sul cd di VB? Io non la trovo, e non
e' stata installata. Sono io l'ottuso o non c'e' (ed eventualmente dove la
posso trovere)?
Vi ringrazio per l'aiuto,
Davide.

 riempite di colore.
Te la puoi cavare bene usando queste 4 Api: CreatePen , CreateSolidBrush,
SelectObject e Polygon.
Ti serve una penna per disegnare il contorno del poligono. Per questo chiami
la CreatePen e gli passi parametri che identificano lo stile (linea
continua, punteggiata o altro), lo spessore in pixel e il colore.
Poi chiami la SelectObject a cui passi l'Hdc della picture (o della form) su
cui disegnare, e l'handle della penna appena creata.
Poi ti serve un pennello che userai per riempire l'area. Per questo devi
chiamare la CreateSolidBrush, passando come parametro il tipo di colore che
vuoi.
Quindi chiami la SelectObject a cui passi l'Hdc della picture (o della form)
su cui disegnare, e l'handle del pennello appena creato.
A questo punto per disegnare il poligono e riempirlo, usi l'api Polygon, che
vuole i seguenti parametri:
Hdc della picture (o della form) su cui disegnare, Array di coordinate
(espresse in pixel), e numero delle coordinate. Questa Api, disegnerà il
bordo del poligono con la penna corrente, riempiendolo con il pennello
corrente.
Questa è la teoria. La pratica viene lasciata come esercizio per il lettore.
;-)
Ciao
*Roby*
P.S.
Scherzo. ;-)
Qui trovi un esempio, ma non segue esattamente la logica della mia
spiegazione, perchè non disegna il bordo usando una penna, ma preferisce
usare una region (de gustibus...) :
http://www.ilook.fsnet.co.uk/vb/vbshape.htm

Qui trovi un esempio [..] 
http://www.ilook.fsnet.co.uk/vb/vbshape.htm
Grazie ancora,
Davide.

 miei problemi, si tratta di un'operazione "di precisione" :-)
Usa come offset da aggiungere ai vertici, la posizione del punto 0,0 dei
tuoi assi cartesiani. Attenzione però che Windows funziona al contrario di
come normalmente disegni gli assi su un foglio di carta, perchè per lui il
punto 0,0 è l'angolo in alto a sinistra, e la coordinata Y diventa positive
man mano che ti sposti verso il basso (l'opposto di quello che capita su
carta, appunto)
Mi raccomando, studiati
l'esempio.
http://www.ilook.fsnet.co.uk/vb/vbshape.htm
 ;-)
Ciao
*Roby*

*Roby*
Grazie ancora, e a presto (appena il tempo di studiare a fondo l'esempio, e
"smanettarci" un po').
Davide.

*Roby*
Ciao Roberto,
ti volevo ringraziare per tutte le informazioni che mi hai dato.
In particolare, cercando in rete, ho risolto i miei problemi (almeno quelli
piu' immediati :-P ).
All' indirizzo 
http://digilander.iol.it/VBItalia/Lezioni/TUTORIALS.html
ho trovato una funzione "degna epigona" della Paint di VBdos. Si tratta
della ExtFloodFill, funzione che riempie un'area chiusa del colore
prescelto. La descrivo brevemente, magari risulta utile a qualcun altro:
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
dove:
- hdc e' il famoso handle di cui mi parlavi nel precedente messaggio
- x ed y indicano le coordinate a partire da cui l'area viene riempita di
colore
- crColor e' il colore del bordo dell'area; deve essere espresso mediante il
codice RGB
- wFillType indica il modo in cui riempire l'area prescelta:
(1) FLOODFILLBORDER: riempie finche' incontra il bordo del colore indicato
da crColor
(2) FLLODFILLSURFACE: l'area di riempimento e' definita dal colore dell'area
stessa .
Sul tutorial si dice che il bordo puo' essere disegnato tramite una penna,
ma in realta' ho visto che basta una semplice area delimitata da rette
disegnate tramite Line.
Il tutorial trovato mi sembra molto ben fatto, perche' propone esempi
dettagilati per ogni voce.
In particolare, ho apprezzato il fatto che le API sono indicate chiaramente
ed in sintassi VB (ma perche' su msdn le API sono indicate solo in C? Me le
devo tradurre io in VB, o non so dove cercarle nella sintassi giusta?).
Purtoppo mancano alcune API "salienti" come la CreatePen o Polygon...
Sai mica dove le posso trovare scritte in VB? In particolare la Polygon che
mi sarebbe assai utile?
Ho anche studiato meglio l'esempio che mi hai indicato. L'ho provato e ho
piu' o meno capito cosa fa e come lavorano le funzioni che usa.
Da quello che ho visto, il tipo POINTAPI non e' altro che una sorta di
puntatore ad una regione dello schermo (o ad un oggetto VB tipo una Form),
che mi permette di indicare la posizione in cui applicare altre API tipo
CreatePen. Ho intuito bene, piu' o meno?
Comunque, per concludere, ti ringrazio ancora tantissimo.
Sei stato molto preciso, estremamente chiaro e soprattutto molto gentile e
paziente con VBber (ho coniato un neologismo? :->) alle primissime armi.
Spero di poter contraccambiare prima o poi.
Grazie,
Davide.

mi sarebbe assai utile?
Sull ' Api Viewer (Visualizzatore API, o giu' di li', in italiano) fornito con vb.
Contiene parecchie dichiarazioni in vb (qualcuna contiene errori, ma
penso sia fisiologico).
Molte si possono trovare in rete: quando trovi un prototipo per C/C++
prova a cercare con un buon motore di ricerca (tipo google):
<nome_funzione> +"visual basic"
In mezzo alla spazzatura troverai l' oro :-)
ciao, hal

 Spero di poter contraccambiare prima o poi.
Continua così, e presto sarai tu a spiegare le cose a me. :-)
Ciao
*Roby*