Newsgroup: it.comp.lang.visual-basic
Titolo: AlphaBlend e TrasparentBlt

Salve a tutto il ng. Ho una domanda riguardo le API in oggetto: avrei la
necessità di incollare una immagine di 100x100 pixel, con disegnati dei
pulsanti per la gestione del flusso video play, rewind, forward, stop in
forma circolare, all'interno in un'altra. Lo sfondo dell'immagine è rosso
(RGB 255,0,0) e quindi usando la  TrasparentBlt riesco a copiare la sola
zona circolare dell'immagine quadrata, escludendo i pixel rossi. Ora, vorrei
pure che l'immegine circolare diventi trasparente, in moda da poter vedere
comunque l'immagine sottostante, mantenendo però ottivati gli eventi del
mouse sulla seconda picture e non sulla prima. Per fare la trasparenza uso
la Alphablend che però copia l'immagine quadrata, e non quella circolare.
Credo che la soluzione sia un utilizzo di entrambe le API ma non so in che
modo. Qualcuno ha qualche idea?
Ciao a tutti.

 Ora, vorrei pure che l'immagine circolare diventi trasparente
Temo che non si sia capito esattamente cosa vuoi. Vediamo di ricapitolare:
Picture A = Pulsanti
Picture B=Sfondo con zone sensibili
Vuoi mostrare A su B, mantenendo attivi sia gli eventi di A che quelli di B,
però A ha una forma particolare e deve essere trasparente in più parti.
Corretto?
E allora perchè hai colorato di rosso solo il contorno dell'area circolare e
non anche lo spazio tra i pulsanti? Se colorassi di rosso _tutte_ le parti
che devono essere trasparenti, con la sola AlphaBlend risolveresti tutti i
problemi e non avresti bisogno della TransparentBlt.
In alternativa, usa una sola PictureBox, e ad ogni click vai a controllare
su di una bitmap nascosta se sei su di una area sensibile. Ti basta che la
bitmap nascosta abbia al posto delle aree sensibili delle colorazioni
uniformi. Ad ogni area corrisponde un colore, e il colore ti fa da indice
del pulsante virtuale.
Ciao
*Roby*

 ha scritto nel messaggio
news:ar3e15$evr2a$1...@ID-94194.news.dfncis.de...


 incollate e rese sempitrasparenti
Insomma 2 livelli diversi, uno di trasparenza e uno di semitrasparenza
applicati contemporaneamente...
A quanto ne so non è possibile (ma mi piacerebbe essere smentito).
Se si tratta di una figura semplice, la trasparenza della tua Bitmap A può
essere gestita tramite le Region (cerca un esempio per SetWindowRgn su una
guida delle Api, e capisci subito come fare).
A quel punto dovresti poterci applicare anche la semitrasparenza tramite la
AlphaBlend
Però forse se spieghi l'esigenza generale si trova un altro modo, magari un
po' meno affamato di risorse di sistema.
Per esempio, i pulsanti sono veri pulsanti o sono delle label su una bitmap?
Le bitmap non possono essere prelavorate prima invece che a runtime?
Ciao
*Roby*

 ha scritto nel messaggio
news:ar6go0$flt52$1...@ID-94194.news.dfncis.de...


 percorribile per immagini di forma semplice
Le region possono essere anche molto complesse se le crei con la
CreatePolyPolygonRgn.
Poi però hai bisogno che il computer e la scheda video siano di ottima
qualità per gestire il refresh di una finestra con una forma molto complessa
e con la trasparenza.
Temo tu debba fare un bel po' di prove e ripiegare eventualmente su di una
soluzione di compromesso. Per esempio, mentre è attiva la tastiera non è
necessario che sia attivo anche lo scrolling, no? Potresti allora, solo per
quella particolare situazione,  congelare la visualizzazione dello sfondo, e
disegnarci sopra la tastiera, gestendo poi l'editing su di una singola
bitmap.
In bocca la lupo, e fammi sapere che soluzione decidi di adottare.
Ciao
*Roby*

 le Region.
Ahem, questo pararafo l'ho scritto pensando alle Layered Windows più che
all'AlphaBlend.
Se usi un sistema operativo da Windows ME in poi, l'esempio è questo:
Crea un nuovo progetto, inserisci come sfondo della form una immagine
qualunque e copici queste righe di codice:
Private Declare Function SetWindowLong _
   Lib "user32" Alias "SetWindowLongA" _
   (ByVal hWnd As Long, ByVal nIndex As Long, _
   ByVal dwNewLong As Long) As Long
Private Declare Function Layer Lib "user32" _
   Alias "SetLayeredWindowAttributes" _
   (ByVal hWnd As Long, ByVal crKey As Long, _
   ByVal bAlpha As Byte, ByVal dwFlags As Long) _
   As Long
Private Sub Form_Activate()
   SetWindowLong hWnd, (-20), &H80000
   Layer hWnd, 0, CByte(128), &H2
End Sub
In questo modo crei una form trasparente. Applicaci le region, e hai a
disposizione un pannello coi pulsanti che può stare in primo piano in
trasparenza mentre lo sfondo scrolla.
Però non posso assicurarti che poi il computer ci stia dietro coi refresh
:-)
Ciao
*Roby*