Categories: VC/C++Windows

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.

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:

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.

Share
Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.

Published by
Giampaolo Rossi
Tags: MFC

Recent Posts

Un Abbonamento per Tutti i Software

Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…

11 mesi ago

Software di Magazzino Gratuito

MerciGest è un software per la gestione del magazzino completamente gratuito. Continua a leggere→

11 mesi ago

Mettere il PC in Lock Screen

In ufficio può capitare di doversi allontanare dal proprio posto di lavoro, ecco che allora…

3 anni ago

Fare il reset togliendo la corrente

In questo articolo vedremo quando è più o meno utile togliere la corrente ad un…

3 anni ago

Prossimi Aggiornamenti Software

Dopo la pausa invernale dovuta al lavoro che devo fare per sostentarmi, eccomi di nuovo…

3 anni ago

Come Eliminare i Files in Windows

Vediamo come eliminare i files direttamente da Windows senza utilizzare il cestino. Continua a leggere→

3 anni ago