Domanda

Vorrei creare una finestra di livello superiore (cioè, non ws_child) con trasparenza. Tuttavia, non voglio che sia una maschera semplice, in cui un dato pixel è completamente trasparente o completamente opaco. E non voglio che sia tale che l'intera finestra abbia un po 'di livello alfa. Piuttosto, vorrei che la finestra fosse essenzialmente del tutto trasparente, con una bitmap disegnata con un canale alfa, in modo tale che la bitmap si fonda con qualunque finestre possano essere dietro di essa. Immagina, diciamo, una sunburst, in cui l'alfa di un'immagine si fonde da opaco a completamente trasparente verso l'esterno dal centro.

Ho trovato due metodi che entrambi si avvicinano a quello che voglio fare, ma non del tutto. Usando le regioni, posso eliminare una sezione che è completamente trasparente. Usando le finestre a strati, posso anche fare qualcosa di simile (o posso anche rendere l'intera finestra leggermente trasparente, ma non è quello che voglio). Ho esaminato altri stili, come ws_ex_transparent e ws_ex_composite, ma inutilmente.

Posso ottenere questo tipo di effetto a funzionare bene sulle finestre dei bambini, poiché si fondono con le finestre dei genitori all'interno della regione dei genitori. Farlo funzionare in modo simile per le finestre di alto livello continua a sfuggirmi.

So che questo può essere fatto, poiché le persone mi hanno assicurato di averlo visto in altri programmi. Mi sento come se non stessi capendo appieno qualcosa di semplice qui sulla pittura di finestre.

È stato utile?

Soluzione

Finestre a strati (WS_EX_LAYERED) dovrebbe fare il lavoro, tenendo presente che devi usare UpdateLayeredWindow() e un formato bitmap in qualche modo insolito (alfa pre-multiplicato a 32 bit) per specificare i valori alfa per pixel (SetLayeredWindowAttributes() Ti consentirà di specificare solo un singolo valore alfa per l'intera finestra o il tasto di colore).

Dici di aver già provato questo: quali problemi hai riscontrato?

Altri suggerimenti

L'unico modo in cui sono a conoscenza di ottenere alfa per pixel su una finestra è UpdateLayerEdWindow ().
Dai un'occhiata a questo link MSDN: http://msdn.microsoft.com/en-us/library/ms997507.aspx

Si noti che quando si utilizzano UpdateLayerEdWindow non è necessario rispondere a WM_Paint o altri messaggi di pittura, perché ha già fornito la rappresentazione visiva per la finestra e il sistema si occuperà di conservare quell'immagine, componendola e renderla sul schermo. Updatelayeredwindow è abbastanza potente, ma spesso richiede la modifica del modo in cui un'applicazione Win32 esistente disegna.

Scommetto che questi sono i problemi che stavi riscontrando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top