2009-09-30 3 views
2

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.

Répondre

2

http://www.codeproject.com/KB/dialog/rtaGlassEffectLib.aspx

Comme vous avez pu le constater, la propriété GlassEnabled est un grand pour tester si cette fonction est activée par votre système, puis commencer à utiliser notre bibliothèque et appelez showEffect() fonction pour montrer l'effet de verre, Maintenant supposons que l'utilisateur a désactivé/activé le thème Aero pendant que votre application était en cours d'exécution !! Cela peut provoquer un problème dans l'aspect de votre application .

Pour résoudre ce problème, deux événements ont été ajouté à la bibliothèque pour garder une trace de les changements qui se produisent au système pendant que votre application est en cours d'exécution, ces deux événements sont événement GlassEffectEnabled et GlassEffectDisabled.

Maintenant, pour ceux qui aiment savoir comment choses fonctionne .. Je peux dire que ces événements ont été mis en œuvre par le suivi les messages provenant du système de les fenêtres à notre application à la recherche le message WM_SYSCOLORCHANGE que indique que les couleurs du système ont été remplacées par . Donc, en faisant un rapide comparer entre l'état de la propriété GlassEnabled avant et après ce message, nous pouvons décider si cette fonctionnalité a été activée ou non.