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:

alt text


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:

alt text


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:

alt text

Microsoft è riuscita a farlo funzionare, come si può vedere da questo suggerimento da Internet Explorer:

alt text


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

.
È stato utile?

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.

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