Estoy creando lo que debería ser una aplicación Win32 C++ muy simple cuyo único propósito es mostrar SOLO un PNG semitransparente. La ventana no debe tener ningún cromo, y toda la opacidad debe controlarse en el PNG.Creando una ventana transparente en C++ Win32
Mi problema es que la ventana no se vuelve a pintar cuando cambia el contenido debajo de la ventana, por lo que las áreas transparentes de PNG se "atascan" con lo que estaba debajo de la ventana cuando se inició la aplicación.
Aquí está la línea en la que tengo que instalar la nueva ventana:
hWnd = CreateWindowEx(WS_EX_TOPMOST, szWindowClass, szTitle, WS_POPUP, 0, height/2 - 20, 40, 102, NULL, NULL, hInstance, 0);
Para la llamada a RegisterClassEx, tengo este conjunto para el fondo:
wcex.hbrBackground = (HBRUSH)0;
Aquí está mi manejador de mensajes 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 a tener en cuenta es que la aplicación siempre está acoplada a la izquierda de t él pantalla y no se mueve. Pero, lo que está debajo de la aplicación puede cambiar a medida que el usuario abre, cierra o mueve ventanas debajo de ella.
Cuando se inicia la aplicación por primera vez, se ve perfecto. Las partes transparentes (y simi-transparentes) del PNG se muestran perfectamente. PERO, cuando el fondo debajo de la aplicación cambia, el fondo NO se actualiza, simplemente permanece igual desde que se inició la aplicación. De hecho, WM_PAINT (o WM_ERASEBKGND no se llama cuando cambia el fondo).
He estado jugando con esto por bastante tiempo y he estado cerca de estar 100% en lo cierto, pero no del todo. Por ejemplo, he intentado configurar el fondo para (HBRUSH) NULL_BRUSH y he intentado manejar WM_ERASEBKGND.
¿Qué se puede hacer para que la ventana se vuelva a pintar cuando cambie el contenido?
SetBkMode y SetBkColor son las API que he utilizado para hacer el control de los padres transparente. –