J'ai une application Windows simple ici:DWM bascule Composition provoque espace client à perdre alpha
http://www.bengoodger.com/software/chrome/dwm/app.cc
Mon application fournit un cadre de verre sur mesure lorsque DWM compositing est actif, et un cadre entièrement sur mesure lorsqu'elle est inactif ou non disponible. Le "cadre de verre personnalisé" se compose d'une zone de barre de titre agrandie, qui est rapportée par ma mise en œuvre de WM _
NCCALCSIZE pour faire partie de la zone client car je souhaite y intégrer des contrôles transparents. Pour que cette partie de la fenêtre "grande barre de titre" soit transparente, je la remplis de noir transparent (BLACK_BRUSH dans l'exemple simple ci-dessus) qui le fait dessiner comme du verre par le DWM.
Lorsque le système DWM est basculé, par ex. en utilisant le panneau de configuration Paramètres d'apparence pour basculer vers Vista Basic ou Windows Standard, ou lorsqu'une application nécessitant le système pour désactiver DWM est lancée, mon application passe en mode de rendu entièrement personnalisé en gérant WM_NCPAINT, etc. Lorsque je me déconnecte, Attendez-vous à l'inverse, ce qui arrive le plus souvent, sauf que ma «grande barre de titre» est maintenant noire. J'ai trouvé que je peux contourner ce problème en obtenant le placement de la fenêtre, en cachant la fenêtre puis en plaçant à nouveau le placement de la fenêtre dans ma gestion WM_DWMCOMPOSITIONCHANGED, mais cela cause d'autres bogues horribles (le moins est la fenêtre z-order munging).
Ma question est - qu'est-ce que je fais mal ici? Il semble que la fenêtre soit mise dans un état bidon en quelque sorte, et le cacher/montrer le corrige. Comment puis-je empêcher cela? Toute orientation serait grandement appréciée.
Note: J'ai légèrement réduit ce chiffre. Lorsque le verre DWM est activé, toute partie de la zone cliente peinte en noir qui est rendue sur la zone cliente est rendue transparente. Nous avons remarqué que lors du retour à Glass à partir de non-Glass, la zone client est rendue en noir uni au lieu de transparent. Cependant, lorsque la fenêtre est agrandie puis restaurée, la fenêtre redevient transparente. Lorsque je fais ensuite glisser la taille de la fenêtre, la fenêtre de la partie supérieure reste transparente. Lorsque je le fais glisser plus haut, la partie supérieure de la fenêtre redevient noire. C'est comme si le DWM mettait en cache les pixels derrière la fenêtre et que le dimensionnement de la fenêtre en plus grand ne lui permettait pas de peindre quelque chose parce que son cache n'est pas assez grand. Je n'arrive pas à trouver de fonction DWM pour réinitialiser cet état. Il semble que Maximize/Minimize puis Restore ou SetWindowPlacement sont capables de le chatouiller mais ont d'autres effets secondaires indésirables.