Newsgroup: it.comp.lang.visual-basic
Titolo: Copiare immagini con trasparenze velocemente

Ciao a tutti,
ho necessità di creare figure piane bucate tipo ciambella e poi
visualizzarle insieme nel DC di in un form (circa 1280x1024).
Ho fatto così:
    - ho creato un DC al volo (CreateDC),
    - ci disegno dentro l'immagine che voglio (Polygon),
    - la "buco" con una figura di colore 0 (sempre Polygon),
    - poi (ed è qui il problema) copio tutto con la BitBlt nel DC del mio
form, però nessuno dei possibili parametri da passare come "dwRop" sembra
fare al caso mio.
Così cercando nel NG ho trovato la "fantastica" TransparentBlt, che
funziona, ma è di una lentezza abominevole!
Mi domando, non c'è un modo veloce (quanto la BitBlt) per copiare immagini
anche grandi 1024x1024 su di un form ma che mi fa il lavoro della
TransparentBlt !?
Specifico che le immagini in questione hanno tutte la stessa trasparenza
(colore 0) e che le devo calcolare al volo e non posso caricarle da file.
NB.
1) Il codice della TransparentBlt lo si può trovare tra i messaggi postati
in questo NG.
2) Ho una serie di immagini, non solo una da copiare con trasparenza,
altrimenti il problema non si poneva.
Grazie, Templar.

 fare al caso mio.
Devi lavorare con le maschere.
Guarda tra gli esempi forniti con VB, ce n'č uno che fa quello che chiedi
con una doppia passata di BitBlt
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 fare al caso mio.
[cut]
dato che disegni tu stesso le figure con delle chiamate alla polygon,
potresti prendere in considerazione l'uso delle regioni di windows. dovresti
create una regione che includa solo l'oggetto da stampare, quindi applicarla
al dc di destinazione ed infine usare una semplice BitBlt, per poi
ristabilire la regione originaria. La funzione ideale sarebbe la
CreatePolygonRgn, combinandola con la CombineRgn dovrebbe essere abbastanza
semplice ottenere cio' che vuoi :).
facci sapere.
ciao, assa.

...

Grazie per l'idea delle region! Le ho utilizzate così:
    1) Creo la regione del poligono
    2) Creo la regione del buco
    3) Combino in XOR le due regioni
    4) Mando tutto al DC tramite la FrameRgn
e funziona. Posto comunque l'intero codice, potrebbe servire a
qualcun'altro.
Ciao, Templar
Private Type POINTAPI
    x As Long
    y As Long
End Type
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As
Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal
nCombineMode As Long) As Long
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As Any,
ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor
As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As
Long) As Long
Private Declare Function FrameRgn Lib "gdi32" (ByVal hdc As Long,
ByVal hRgn As Long, ByVal hBrush As Long, ByVal nWidth As Long, ByVal
nHeight As Long) As Long
Const ALTERNATE = 1
Const WINDING = 2
Const RGN_AND = 1
Const RGN_COPY = 5
Const RGN_OR = 2
Const RGN_XOR = 3
Const RGN_DIFF = 4
Private Sub Form_Load()
 
    Me.ScaleMode = vbPixels
    Me.Width = 400 * Screen.TwipsPerPixelX
    Me.Height = 300 * Screen.TwipsPerPixelY
 
End Sub
Private Sub Form_Paint()
 
    Dim Poligono(3) As POINTAPI
    Dim Buco(3) As POINTAPI
    Dim NumPuntiPoligono As Long, NumPuntiBuco As Long
 
    Dim hBrush As Long, hRgnPoli As Long, hRgnBuco As Long
 
    NumPuntiPoligono = 3
    Poligono(0).x = 200:   Poligono(0).y = 100
    Poligono(1).x = 380:   Poligono(1).y = 200
    Poligono(2).x = 20:    Poligono(2).y = 200
    NumPuntiBuco = 3
    Buco(0).x = 250:       Buco(0).y = 150
    Buco(1).x = 320:       Buco(1).y = 180
    Buco(2).x = 80:        Buco(2).y = 180
    hBrush = CreateSolidBrush(RGB(255, 0, 0))
    hRgnPoli = CreatePolygonRgn(Poligono(0), NumPuntiPoligono,
WINDING)
    hRgnBuco = CreatePolygonRgn(Buco(0), NumPuntiBuco, WINDING)
 
    CombineRgn hRgnPoli, hRgnBuco, hRgnPoli, RGN_XOR
    FrameRgn Me.hdc, hRgnPoli, hBrush, Me.ScaleWidth, Me.ScaleHeight
 
    DeleteObject hBrush
    DeleteObject hRgnPoli
    DeleteObject hRgnBuco
End Sub
Private Sub Form_Resize()
    Form_Paint
End Sub

     4) Mando tutto al DC tramite la FrameRgn
in alternativa alla FrameRgn, se all'interno del poligono hai bisogno di
inserire disegni piu' complessi, puoi usare SelectObject e poi BitBlt.
in ogni caso... come prestazioni com'è? accettabile?
ciao, assa.
--
gosclient: 
http://members.xoom.it/gosclient/
join the mailing list: 
http://groups.yahoo.com/group/gosclient/join

 ciao, assa.
La FrameRgn č molto lenta, l'ho poi sostituita con FillRgn
estremamente piů veloce, ottima in prestazioni.
Ciao, Templar