redimensionnement de fenetre

redimensionnement de fenetre - C++ - Programmation

Marsh Posté le 15-09-2002 à 23:15:05    

Tout d'abord une précision : je débute et je programme avec les MFC...
Je veux afficher un fichier image .tga à l'écran, je décode le fichier et je l'affiche à coups de BitBlt.  
Jusque là tout va bien, sauf que si je redimensionne la fenêtre dans laquelle se trouve l'image, l'image tremblote et ça fait mal aux yeux (ça ne le fait pas quand je déplace la fenêtre, ou que j'utilise les ascenseurs).
Ma question :
Qu'est ce qui se passe exactement quand je redimensionne la fenêtre?
 
Je pensais bêtement que ça envoyait un message WM_SIZE, et que je pourrais surcharger la fonction CProjectView::OnSize. Seulement le redimensionnement réussi même si ma fonction ProjectView::OnSize est vide!!
Bref, il doit se passer quelque chose de plus qu'un envoi de WM_SIZE et je ne sais pas ce que c'est...
 
Est ce quelqu'un pourrait m'aider?
Merci.
 

Reply

Marsh Posté le 15-09-2002 à 23:15:05   

Reply

Marsh Posté le 15-09-2002 à 23:28:08    

Quand tu redimensionnes la fenêtre, ca se fait progressivement. Pas pixel par pixel mais presque. Et, à chaque fois, ton appli reçoit un message lui demandant de redessiner la fenêtre. C'est de là que vient le scintillement.

Reply

Marsh Posté le 15-09-2002 à 23:49:21    

il y a un WM_SIZE, un WM_PAINT (normal), un WM_ERASEBACKGROUND. donc si tu fais un simple BitBlt(), le fond va être effacé, puis ton image affichée par dessus, d'où le scintillement : deux affichages au même endroit en un temps très court. pour l'éviter, tu peux :
 
* surcharger WM_ERASE... et ne pas effacer l'endroit où est l'image. pas très propre.
* changer WM_ERASE... et WM_PAINT en un 'écran virtuel' : tu fais toutes les opérations nécessaires en mémoire, tu blittes d'un coup le résultat -> plus de scintillement. regarde du côté de CreateCompatibleDC() & co.
 
(au passage, WM_SIZE est juste une notification pour que tu puisses mettre à jour ton applic : par exemple si tu affiches du texte aligné à droite de ta fenêtre, il faut updater ses coordonnées).

Reply

Marsh Posté le 16-09-2002 à 00:15:06    

Merci youdontcare:)
J'avais pas encore rencontré le WM_ERASEBACKGROUND...
Je vais essayer le coup de l'écran virtuel:)

Reply

Marsh Posté le 16-09-2002 à 00:31:17    

petite rectification, le nom exact est WM_ERASEBKGND.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed