Creare Finestre Trasparenti in Windows

Creare delle finestre trasparenti in Windows è stato da sempre il sogno di molti sviluppatori, compreso il sottoscritto. Molti anni fa all’uscita dell’SDK per Windows 3.1 molti di noi si erano accorti della presenza di un’invitante nome di stile esteso per le finestre, WS_EX_TRANSPARENT, peccato che quello che prometteva non funzionasse come ci si aspettava.
Una finestra con lo stile WS_EX_TRANSPARENT non disegna il proprio background ma prende quello corrente che è la parte di schermo che giace sotto la finestra. Lo stile CS_SAVEBITS provoca il non invio del messaggio WM_PAINT alle finestre sottostanti e quindi con uno sfondo con il background avuto al momento della creazione. Purtroppo finestre di questo tipo devono avere dimensioni ridotte e non possono essere spostate, quindi destinate ad uno schermo fisso, non molto utili al programmatore.
Con l’arrivo di Windows 2000 le cose sono cambiate, difatti da quella versione in avanti è possibile impostare lo stile esteso WS_EX_LAYERED e poi rendere trasparente una finestra con la funzione

BOOL SetLayeredWindowAttributes( COLORREF crKey, BYTE bAlpha, DWORD dwFlags);

Il primo argomento è il colore che viene reso trasparente, il secondo è il grado di trasparenza del colore, può avere valori da 0 ( non trasparente ) a 255 ( non visibile ) e l’ultimo è un campo di opzione sull’azione da compiere ( vedere la documentazione in inglese in questa pagina ). Vediamo allora un semplice esempio per mostrare il funzionamento, in particolare creeremo un progetto con un dialogo in Visual Studio ed inseriremo uno slider per modificare il grado di trasparenza della finestra, ecco il modello che occorre creare nel progetto.

Modello Finestra

Il modello di finestra da creare per l'esempio

Una volta modificata la struttura della finestra modale di base occorre aggiungere lo stile e richiamare SetLayeredWindowAttributes, tutto questo lo facciamo nella funzione virtuale OnInitDialog.

...
#if(_WIN32_WINNT >= 0x0500)
   SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE,
   GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE)|WS_EX_LAYERED);
#endif
...
#if(_WIN32_WINNT >= 0x0500)
   SetLayeredWindowAttributes(0, 255, LWA_ALPHA);
#endif

   SetDlgItemText(IDC_STATIC_TRASP, _T("Trasparenza 0%"));
...

L’ultima istruzione mostra la trasparenza di partenza sul controllo statico sotto lo slider. Da notare che ho inserito tutte queste istruzioni tra delle direttive del preprocessore, in modo da non dover compilare per versioni precedenti a Windows 2000. Ora facciamo in modo di controllare l’opacità della finestra agli spostamenti del controllo slider, che per questo deve inviare le notifiche alla finestra padre.

...
#if(_WIN32_WINNT >= 0x0600)
void CTestMFCDlg::OnTRBNThumbPosChangingSliderTrasp(
   NMHDR *pNMHDR, LRESULT *pResult)
{
   NMTRBTHUMBPOSCHANGING *pNMTPC = reinterpret_cast(pNMHDR);
   *pResult = 0;

   CString buffer;
   int nTrasp = 255 / 100 * pNMTPC->dwPos;

#if(_WIN32_WINNT >= 0x0500)
   SetLayeredWindowAttributes(0, 255 - nTrasp, LWA_ALPHA);
#endif

   buffer.Format(_T("Trasparenza %d"), nTrasp / 2);
   buffer += _T("%");
   SetDlgItemText(IDC_STATIC_TRASP, buffer);
}
#endif

Purtroppo la notifica dello slider è supportata da Windows Vista in poi, ecco la causa delle direttive del preprocessore. Una volta completato il tutto possiamo compilare ed eseguire:

Finestra trasparente

La finestra trasparente a seconda del movimento dello slider

Oggi creare delle finestre trasparenti con l’SDK di Windows è molto semplice ed immediato, come abbiamo dimostrato da questo semplicissimo esempio.

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in VC/C++, Windows e contrassegnata con . Contrassegna il permalink.