Je suis en train de créer ce qui devrait être une application Win32 C++ très simple dont le seul but est d'afficher UNIQUEMENT un PNG semi-transparent. La fenêtre ne doit pas avoir de chrome, et l'opacité doit être contrôlée dans le PNG lui-même.
Le problème est que la fenêtre ne se repeint pas lorsque le contenu de la fenêtre change, de sorte que les zones transparentes du PNG sont "coincées" avec ce qui se trouvait sous la fenêtre lors du démarrage initial de l'application.
Voici la ligne où je configure la nouvelle fenêtre :
hWnd = CreateWindowEx(WS_EX_TOPMOST, szWindowClass, szTitle, WS_POPUP, 0, height/2 - 20, 40, 102, NULL, NULL, hInstance, 0);
Pour l'appel à RegisterClassEx, j'ai défini ceci comme arrière-plan :
wcex.hbrBackground = (HBRUSH)0;
Voici mon gestionnaire pour le message WM_PAINT :
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
Gdiplus::Graphics graphics(hdc);
graphics.DrawImage(*m_pBitmap, 0, 0);
EndPaint(hWnd, &ps);
break;
}
Une chose à noter est que l'application est toujours ancrée à gauche de l'écran et ne bouge pas. Mais ce qui se trouve sous l'application peut changer lorsque l'utilisateur ouvre, ferme ou déplace Windows sous l'application.
Lorsque l'application démarre, elle semble parfaite. Les parties transparentes (et quasi-transparentes) du PNG apparaissent parfaitement. MAIS, lorsque l'arrière-plan sous l'application change, l'arrière-plan ne se met pas à jour, il reste le même qu'au premier démarrage de l'application. En fait, WM_PAINT (ou WM_ERASEBKGND ne sont pas appelés lorsque l'arrière-plan change).
Je joue avec ce problème depuis un certain temps et j'ai presque réussi à le résoudre à 100%, mais je n'y suis pas arrivé. Par exemple, j'ai essayé de définir l'arrière-plan sur (HBRUSH) NULL_BRUSH et j'ai essayé de gérer WM_ERASEBKGND.
Que peut-on faire pour que la fenêtre se repeigne lorsque le contenu qu'elle contient change ?