Win32: Come rendere finestra a più livelli ombra onore non rettangolare?
-
19-09-2019 - |
Domanda
Ho creato un stratificato finestra aggiungendo la la WS_EX_LAYERED stile esteso:
wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;
Windows userà nero come il valore del colore chroma key. ho intenzione di lasciare un ampio bordo nero per rendere il problema evidente:
Dopo che la finestra è costruito, gli dico di utilizzare nero come un chroma-key colore :
SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY);
Ora la finestra pop-up appare a strati parzialmente trasparente:
Il problema è il passo finale. voglio usare CS_DROPSHADOW stile di classe, disponibili a partire da Windows XP, per creare una goccia-ombra:
wndClass.Style = wndClass.Style | CS_DROPSHADOW;
Si apre l'ombra, ma l'ombra circonda la finestra rettangolare originale, e non tiene in considerazione la trasparenza della finestra fornita dalla finestra a più livelli:
Qualcuno sa quale opzione magico che ho perso da qualche parte che renderà l'ombra onorare la finestra a più livelli non rettangolare?
Un altro esempio di dove appare questo problema è quando non si include il 6px padding / margine. La finestra di suggerimento come disegnato da temi Windows® non è rettangolare. Questo lascia un piccolo spazio visibile quando la finestra è trasparente, ma non appare un'ombra:
Microsoft è riuscita a farlo funzionare, come si può vedere da questo suggerimento da Internet Explorer:
Guardando più da vicino a una finestra di classe suggerimento tooltips
di Windows. Usando SpyXX - posso ottenere la sua finestra rect, e stili di classe:
SpyXX dice:
Rectangle: (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect: (0, 0)-(104, 20), 104x20
Tutto fa pensare che la finestra stessa essendo 104x20 pixel, con l'ombra al di fuori della finestra stessa. (Che è coerente con CS_DROPSHADOW
.)
Avanti posso guardare gli stili della classe di finestra tooltips
:
Windows Styles: 94000001
WS_POPUP 80000000
WS_VISIBLE 10000000
WS_CLIPSIBLINGS 4000000
TTS_ALWAYSTIP 1
Extended Styles: 00080088
WS_EX_LAYERED 80000
WS_EX_TOOLWIN 80
WS_EX_TOPMOST 8
È interessante notare, non usa CS_SAVEBITS
(0x800
); che è utile per le piccole, di breve durata, le finestre.
Né usa CS_DROPSHADOW
(0x20000
). Così ora mi chiedo come mai il disegno di fuori della propria finestra?
Nota. Transparent finestre sovrapposte è documentato come la tecnica preferita sulle regioni
Modifica a strati di Windows sono stati in giro con Windows 2000. CS_DropShadow è stato aggiunto con XP
.Soluzione
finestre sovrapposte trasparenti è documentata la tecnica preferita sulle regioni.
Tuttavia, CS_DROPSHADOW
non prestare attenzione alle regioni. Se si ritaglia o comunque modellare il vostro finestra usando una regione, il drop-ombra seguirà la nuova struttura.
Per fortuna, è possono le regioni d'uso con finestre sovrapposte, e combinando i due ottenere l'effetto che stai cercando.
A proposito:. Tooltips_class32 fa uso CS_DROPSHADOW - non si vedrà nelle stili di finestra perché è uno stile di classe, non uno stile di finestra
Altri suggerimenti
Perché non si utilizza LWA_ALPHA e costruire l'ombra nell'immagine?
Modifica in reponse al tuo commento:
A) non ti smettere di usare un alfa PNG incanalata per solo un'ombra. BLT le 2 immagini insieme e usare come una singola immagine.
B) La sua non è difficile da generare un ombra. Nell'immagine che avete inviato il suo nero con 3 diversi valori alfa.
C), ma non funziona lo fa? cioè il tempo di essere creativi.
D) Quindi non cercare di ottenere le finestre per fare qualcosa che non farà per voi.
E) è del tutto irrilevante. finestre sovrapposte maniglia che per voi.
Vi consiglio vivamente di imparare di più su finestre sovrapposte, perché ti può aiutare al vostro obiettivo.
Edit2: Hai la bitmap. La sua abbastanza facile da eseguire la scansione sopra l'immagine e trovare quale i bit saranno colore digitato (identificando il te nero) e la gallina modificare che per avere un alfa pari a 0, dove tutto il resto avrà un alfa 255 (Not: Potrebbe essere necessario convertire l'immagine in un'immagine a 32 bit da un formato di colore più bassa, si può fare questo con la creazione di una nuova DC e copiare l'immagine). Questo vi darà lo stesso effetto con LWA_ALPHA come con LWA_COLORKEY. Da qui la sua abbastanza facile identificare il pixel sul bordo, dove i cambiamenti di colore (R = 0, G = 0, B = 0, A = 0). È quindi cambiare quel primo pixel per avere un n alfa del 192, l'un colpo a 128 e quello in basso a 64. Si dispone ora di una gradazione alpha'd sotto l'immagine che apparirà come l'ombra. È possibile regolare l'alfa per ottenere l'effetto desiderato.
CS_DROPSHADOW
funziona solo con finestre rettangolari standard. finestre WS_EX_LAYERED
non supportano tutto. Sono più di un basso livello, il metodo self-service per disegnare esattamente quello che vuoi.
Per ottenere un'ombra, si dovrà generare il drop-ombra se stessi dal canale alfa nell'immagine.