Sto creando quella che dovrebbe essere una semplice applicazione Win32 C++ che ha l'unico scopo di visualizzare SOLO un PNG semitrasparente. La finestra non dovrebbe avere alcun cromo e tutta l'opacità dovrebbe essere controllata nel PNG stesso.Creazione di una finestra trasparente in C++ Win32
Il mio problema è che la finestra non viene ridisegnata quando il contenuto sotto la finestra cambia, quindi le aree trasparenti del PNG sono "bloccate" con quello che era sotto la finestra quando l'applicazione è stata inizialmente avviata.
Ecco la linea dove ho messa a punto la nuova finestra:
hWnd = CreateWindowEx(WS_EX_TOPMOST, szWindowClass, szTitle, WS_POPUP, 0, height/2 - 20, 40, 102, NULL, NULL, hInstance, 0);
Per la chiamata a RegisterClassEx, ho questo set per lo sfondo:
wcex.hbrBackground = (HBRUSH)0;
Ecco il mio gestore per il messaggio WM_PAINT:
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
Gdiplus::Graphics graphics(hdc);
graphics.DrawImage(*m_pBitmap, 0, 0);
EndPaint(hWnd, &ps);
break;
}
una cosa da notare è che l'applicazione è sempre ancorata a sinistra del t si scherma e non si muove. Ma ciò che è sotto l'applicazione può cambiare quando l'utente apre, chiude o sposta finestre sotto di esso.
All'avvio, l'applicazione sembra perfetta. Le parti trasparenti (e semitrasparenti) del PNG mostrano perfettamente. MA, quando lo sfondo sotto l'applicazione cambia, lo sfondo NON si aggiorna, rimane solo lo stesso da quando l'applicazione è stata avviata per la prima volta. Infatti, WM_PAINT (o WM_ERASEBKGND non viene chiamato quando lo sfondo cambia).
Ho giocato con questo per un po 'e sono arrivato a ottenere il 100% giusto, ma non proprio lì. Ad esempio, ho provato a impostare lo sfondo su (HBRUSH) NULL_BRUSH e ho provato a gestire WM_ERASEBKGND.
Cosa è possibile fare per ridisegnare la finestra quando cambia il contenuto sottostante?
SetBkMode e SetBkColor sono le API che ho usato per fare il controllo padre trasparente. –