Newsgroup: it.comp.lang.delphi
Titolo: Realizzare un TWinControl trasparente...

Ciao a tutti.
Avrei un problema e magari qualcuno c'e' già incappato.
Ho necessità di creare un componente che abbia le seguenti caratteristiche:
1) Abbia un handle
2) Sia trasparente
Dopo aver fatto una ricerca sul mio motore di ricerca
(
http://www.delphiseek.com
 <- un po' di pubblicita' non guasta mai... ;-) )
ho trovato due cose che pero' non posso mettere insieme. Mi spiego: devo
creare un qualsiasi "oggetto" (nel senso di "coso") che possa essere
trascinato e ridimensionato dall'utente all'interno della form e che faccia
vedere lo sfondo della form stessa (un'immagine). Ora:
1) TPanel è trascinabile con un trick che, agganciandosi a WM_NCHITTEST, lo
convince che il click viene effettuato sempre sulla caption, anche se si
prende un punto interno dell'area client, ma non è trasparente.
2) Ogni componente derivato da TGraphicControl può essere trasparente ma non
ha un handle, quindi il trucco al punto 1 non puo' funzionare.
Ho provato a creare diversi componenti discendenti da TWinControl,
TCustomControl, ecc ma puliscono il TCanvas in fase di creazione (ho provato
a ridichiarare Pain override, vuota senza nemmeno chiamate alla Paint
inherited, e il canvas appare sempre di colore clBtnFace). Potrei allora
creare uno snapshot dell'area client della finestra in fase di creazione del
componente ma, dovendo chiamare prima "inherited Create", prendo lo snapshot
con il disgraziato canvas del componente gia' bell'e disegnato. Qualcuno ha
consigli?
Grazie e ciao
P.S. : Sara' un caso che tutti i componenti, dico tutti, che ho trovato che
siano trasparenti non abbiano un handle e tutti quelli con un handle non
abbiano mai la possibilità di essere trasparenti? (vedere TLabel e
TStaticText per credere)
P.P.S. : L'esempio sul sito Borland per creare form trasparenti non aiuta un
gran che. Funziona con le form ma non con tutti gli altri TWinControl.
Arrigrazie
Ciao
Stefano

 prende un punto interno dell'area client, ma non è trasparente.
Hai provato con lo stile WS_EX_TRANSPARENT (dovrai fare l'override di
CreateParams) ?
Può darsi che tu abbia dei problemi di aggiornamento della visualizzazione
ma sarebbe già un buon inizio...
Cmq penso che tu debba intercettare il WM_ERASEBKGND per evitare che un
TWinControl pulisca il suo canvas...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

 >
Adesso ho provato e... funziona. Il problema che rimane č un flickering
terribile. Il fatto e' che, per aggiornare la trasparenza, devo per forza
chiamare Invalidate all'interno di Paint senno' continua a mostrarmi la
stessa area. Qualche suggerimento?
Grazie e ciao.
Stefano
--
-----------------------------------------------------------------
delphiseek.com
The Delphi stuff Search Engine
http://www.delphiseek.com


Non ho provato ancora. Ho aggirato il problema settando Brush.Style :=
bsClear in Create. Cosi' lo sfondo si vede ma ha lo stesso problema di
WS_EX_TRANSPARENT, cioe' e' adatto ad aree trasparenti non spostabili
(l'area client del controllo non si aggiorna riflettendo cio' che c'e'
dietro, ma rimane sempre la stessa area disegnata (cavolo se mi esprimo male
talvolta...).
Penso di dover lavorare a livello di Window Regions. Da quanto so pero',
facendo cosi', l'area diventa veramente trasparente anche al mouse, per cui
perdo la possibilita' di spostare e ridimensionare il TPanel.
Per adesso ho agito cosi':
1) Nel costruttore Create prendo uno snapshot del desktop che memorizzo in
un TBitmap e imposto Brush.Style a bsClear
2) Nella procedura overrided Paint copio l'area sottostante nel canvas del
TPanel, quindi disegno eventuali altre cose (ex. bordi ecc)
I problemi a questo punto sono:
1) Perche' se faccio
var TProva : TCanvas;
...
TCanvas.Handle := GetDC( (AOwner As TForm).Handle)
mi ritrovo a copiare l'handle del desktop e non quello della form che
contiene il TPanel? (in effetti il TPanel e' trasparente, ma mi crea un
curioso "buco" nella form e mi fa vedere in mezzo) (magari mi sono
rimbambito e non riesco a vedere l'errore da solo)
2) Il TPanel si muove, e' troppo trasparente ma e' un po' lento se
ridimensionato troppo. C'e' qualche funzione piu' efficace di BitBlt che
consenta di ottenere lo stesso risultato?
Grazie e ciao
Stefano


 inherited, e il canvas appare sempre di colore clBtnFace). Potrei allora
Hai intercettato anche il messaggio WM_ERASEBKGND che viene spedito alla 
finestra prima di WM_PAINT?
-- 
Roberto Lupi

 stessa area. Qualche suggerimento?
Forse può esserti utile TWinControl.DoubleBuffered, ma non so come 
"interagisca" con il fatto che il controllo deve essere trasparente.
-- 
Roberto Lupi

 ha scritto nel messaggio
news:MPG.134fbabc...@news.ac.freefast.it...


 flickerare.
Questo perché comunque il controllo (o la form) al di sotto del tuo 
controllo viene ripitturata.
Il Windows non può sapere che il tuo controllo è completamente 
trasparente, quindi chiede al controllo sottostante di ripitturarsi e poi 
al tuo di fare lo stesso.
Se questo è il problema, non so come aiutarti.
-- 
Roberto Lupi

 ha scritto nel messaggio
news:MPG.135129701...@news.ac.freefast.it...


Il problema e' risolto. In effetti il componente funzionava benissimo, era
la pulitura del canvas su cui era posizionato a causare il flickering.
Bastava intercettare WM_ERASEBKGND della form su cui posizionavo il
componente e tutto funziona a meraviglia.
Grazie a tutti e ciao
