L'effetto a cui ti riferisci viene spesso utilizzato anche nelle SplashForm, allo scopo di modellare la finestra introduttiva dell'applicazione rendendola trasparente, in alcuni casi "bucata", in corrispondenza di un'immagine caricata al suo interno.
Ho scritto una procedura simile in Delphi; a grandi linee, si tratta di usare le funzioni API CreateRectRgn e CombineRgn.
La funzione CreateRectRgn permette di creare una regione rettangolare; la "regione" definisce un'area di disegno entro la quale ogni operazione di disegno, appunto, viene concessa, mentre all'esterno diviene ininfluente.
La regione può essere associata ad un form affinchè esso venga tracciato seguendo tale regione, quindi la complessità del lavoro si ha nel definire una regione che abbia la forma del bitmap selezionato, ma escludendo le parti che possiedono un colore predeterminato come trasparente.
Si può iniziare creando una regione rettangolare che abbia le dimensioni del bitmap con la funzione CreateRectRgn; in seguito, si scandisce ogni singolo pixel del bitmap e, quando si individua il colore trasparente, si crea una regione rettangolare separata che abbia le dimensioni e la posizione del pixel; attraverso la funzione CombineRgn si combinano le due regioni sottraendo la regione del pixel da quella del bitmap.
Ripetendo l'operazione per tutti i pixel del bitmap, si otterrà una regione rettangolare privata di tutte le microregioni interne appartenenti a ciascun pixel che viene decretato come trasparente.
Attraverso la funzione API SetWindowRgn si può associare la regione risultante alla form, affinchè le operazioni grafiche necessarie al suo tracciamento non escano dall'area definita dalla regione stessa. Inserendo poi un controllo TImage con coordinate (0, 0) nella form con il bitmap stesso, si avrà l'effetto di una form modellata attorno all'immagine che lascia intravedere lo sfondo.
In Delphi 6 e C++Builder 6 sono presenti anche le proprietà Transparent e TransparentColor per le form, ma utilizzando API funzionanti solo su sistemi Windows 2000 e XP, mentre la soluzione presentata prima lavora su qualsiasi sistema.
Ciao!![]()