2010-06-04 1 views
0

J'essaie de comprendre pourquoi j'ai obtenu un rectangle de mise à jour vide lorsque j'appelle InvalidateRect sur une fenêtre transparente. L'idée est que j'ai dessiné quelque chose sur la fenêtre (il est temporairement changé pour avoir un alpha de 1/255 pour le dessin), et ensuite je passe en mode complètement transparent (ie alpha de 0) afin d'interagir avec le bureau & pour être en mesure de déplacer le dessin autour de l'écran sur le dessus du bureau.Obtenir un rectangle de mise à jour vide dans OnPaint après avoir appelé InvalidateRect sur une fenêtre en couches

Lorsque je tente de déplacer le dessin, je reçois son rectangle englobant & l'utiliser pour appeler InvalidateRect, en tant que tel:

InvalidateRect (m_hTarget, & winRect, FAUX);

J'ai confirmé que le winRect est correct, et que m_hTarget est la bonne fenêtre & que son rectangle englobe entièrement winRect. Je reçois le gestionnaire OnPaint dans la classe correspondant à m_hTarget, qui est dérivé d'un CWnd. Dans là, je crée un CPaintDC, mais quand j'essaye d'accéder au rectangle de mise à jour (dcPaint.m_ps.rcPaint) il est toujours vide. Ce rectangle est passé à une fonction qui détermine si nous avons besoin de mettre à jour l'écran (en utilisant UpdateLayeredWindow dans le cas d'une fenêtre transparente).

Si je code dur un rectangle non vide ici, le code restant fonctionne correctement & Je suis capable de déplacer le dessin autour de l'écran.

J'ai essayé de changer le paramètre 'FALSE' en 'TRUE' dans InvalidateRect, sans effet. J'ai également essayé d'utiliser un CDC standard, puis d'utiliser la méthode BeginPaint/EndPaint dans mon gestionnaire OnPaint, juste pour m'assurer que CPaintDC ne faisait pas quelque chose d'étrange ... mais j'ai obtenu les mêmes résultats.

Le code que j'utilise a été initialement conçu pour les fenêtres opaques. Si m_hTarget correspond à une fenêtre opaque, le même ensemble d'appels de fonction entraîne le passage du rectangle correct (c'est-à-dire non vide) à OnPaint. Une fois que la fenêtre est en couches, cela ne semble pas fonctionner correctement.

+0

Cela ressemble à Win32 API? Vous devriez vraiment spécifier. –

+0

De quelles informations supplémentaires avez-vous besoin? J'utilise C++ avec MFC (que je pensais être compris quand j'ai mentionné la partie "CWnd-derived window"). S'il y a quelque chose que je peux ajouter pour que ce soit plus clair, faites le moi savoir et je ferai de mon mieux pour l'expliquer. Cela implique du code au travail, donc je dois faire attention à la façon dont je peux être spécifique. – Shawn

Répondre

0

Je pense que je l'ai compris - c'est une combinaison d'une limitation de Windows + un code étrange dans le cadre interne que j'utilise. Je dois ignorer le rectangle vide & utiliser le rectangle entier de l'écran à la place - il semble fonctionner correctement. Désolé si je n'étais pas assez clair avec ma question initiale - je vais essayer d'être plus précis la prochaine fois.

Questions connexes