2015-09-01 79 views
5

Sto cercando di creare una finestra trasparente con un effetto "vetro" in Windows 10. Questo ha funzionato fino a poco tempo:Finestra sfocata con barra del titolo in Windows 10? Smesso di funzionare dopo Windows Update

Screenshot

Quello che ho fatto è:

  • Vernice sul controller di destinazione incluso un canale alfa. Un modo per farlo in un semplice GDI è costruire un'immagine con un canale alfa e BitBlt che usa SRCCOPY alla DC. Puoi anche utilizzare la funzione AlphaBlend.
  • Quindi io uso SetWindowCompositionAttribute (o DwmExtendFrameIntoClientArea) per abilitare la sfocatura dietro su Windows 10 (o precedente).

Questo ha funzionato fino ad oggi, e improvvisamente ha smesso di funzionare dopo un aggiornamento - la finestra ora è opaca. Ho usato Ripristino configurazione di sistema e sono tornato indietro un giorno e in effetti ha funzionato di nuovo! Qualche idea come posso risolvere questo?

+0

"Poiché GDI non supporta i canali alfa, anche questo imposta il valore alfa di ciascun pixel su zero." Questo non è necessariamente vero; è un dettaglio di implementazione. Il modo comune per creare una finestra con alpha per pixel è utilizzare una finestra a più livelli e chiamare UpdateLayeredWindow. –

+0

@AdrianMcCarthy: Ovviamente è un dettaglio di implementazione non documentato. Ma così si chiama SetWindowCompositionAttribute per creare l'effetto vetro, quindi sono comunque in terra non documentata. Passare a finestre a più livelli richiederebbe una maggiore riscrittura del codice basato su WM_PAINT, e non sono sicuro che funzionerebbe neanche (vorrei una barra del titolo standard opaca, ma un'area di contenuto semitrasparente). Inoltre, la trasparenza "di vetro" dal momento che Vista non è basata su finestre a strati, ma finestre regolari con un canale alfa (la fusione viene eseguita dal DWM). – jdm

+1

Sapete in qualche modo usare 'SetWindowCompositionAttribute' per impostare la sfocatura (come era possibile con' DwmEnableBlurBehindWindow'), per impedirgli di sfocarsi fuori dall'area client? – melak47

risposta

3

Si è verificato che stavo chiamando SetWindowCompositionAttribute in modo errato. Vale a dire, uno dei parametri ha un campo size e stavo inserendo la dimensione sbagliata. Che in passato era un puro incidente.

+0

Potresti espandere questo campo 'size'? –

+0

@ charles.milette È passato un po 'di tempo, ma la funzione utilizza un puntatore per strutturare WINCOMPATTR. In questa struttura, si specifica quale attributo si desidera impostare, un puntatore ai nuovi dati e la dimensione del campo dati. Esempio: https://github.com/jdmansour/mintty/blob/glass/src/winmain.c#L683 – jdm

+0

Oh, giusto. Ti ho pensato dove parlare di un campo di WINCOMPATTR ... –