2011-09-21 3 views
0

Je dessine dans une fenêtre WinAPI en utilisant la fonction SetPixel().WinAPI - éviter le redessin de la fenêtre

Si je redimensionne la fenêtre ou perds le focus (une autre fenêtre est en haut), je perds tout le contenu que je dessine dans la fenêtre.

Je viens d'utiliser

RECT rc; 
GetClientRect(hwnd, &rc); 
RedrawWindow(hwnd, &rc, NULL, RDW_NOERASE | RDW_NOFRAME | RDW_VALIDATE); 

qui a permis d'éviter de redessiner le contenu lorsque je déplace la fenêtre, mais mise à l'échelle et la perte du focus supprime encore le contenu. Est-ce que quelqu'un a une idée de ce que j'ai raté? Dessinez-le dans un tampon/bitmap, puis dessinez-le sur votre fenêtre.

Répondre

6

0

Créez une surface DIB et dessinez-la à la place. Ensuite, redessinez l'image bitmap lors de la redéfinition d'une fenêtre.

Vous essayez de dessiner avec une manière pré-Windows dans Windows. ;)

1

Vous devez dessiner le contenu en mémoire, puis le dessiner dans la fenêtre lorsque vous avez reçu le message WM_PAINT. Il n'y a aucun moyen d'éviter d'utiliser la mémoire tampon car le contexte de périphérique de fenêtre ne sauvegarde pas ce que vous dessinez.

2

SetPixel est très lent, vous ne pouvez pas améliorer votre programme de manière significative. Créez un bitmap en mémoire et dessinez-le sur la fenêtre. Par exemple, vous pouvez le faire en utilisant la fonction StretchDIBits, qui dessine toute la zone mémoire en tant que bitmap dans la fenêtre, au lieu de SetPixel.

paramètres les plus importants de StretchDIBits sont:

VOID CONST * lpBits - réseau de mémoire (pixels). Vous devez le remplir en mémoire au lieu des appels SetPixel.

CONST BITMAPINFO * lpBitsInfo - structure BITMAPINFO qui doit décrire la structure de bitmap. Par exemple, si lpBits a une structure BGRW (4 octets par pixel), BITMAPINFO doit décrire le bitmap couleur vrai.

3

Lorsqu'une fenêtre doit être repeinte, un message WM_PAINT lui sera envoyé. À ce stade, vous devez redessiner toute la fenêtre, ou au moins toutes les parties qui sont contenues dans une région de découpage. Windows effectue une mise en mémoire tampon et une peinture automatique, en particulier il repeint des parties d'une fenêtre qui sont couvertes par d'autres fenêtres alors découvertes. Une fois la fenêtre redimensionnée ou (probablement) invalidée, vous êtes seul. Comme @daniel l'a suggéré, si la peinture est un processus intensif et que vous ne voulez pas le faire chaque fois qu'une peinture est requise, rendez votre contenu dans un bitmap (qui dans ce cas sera un tampon hors écran) et BitBlt (copier) dans la fenêtre si nécessaire. Prenez une copie du livre de Charles Petzold "Fenêtres de programmation" pour obtenir des informations sur la façon dont vous devriez peindre. Si vous écrivez une application WinAPI mais que vous avez utilisé SetPixel, je vous recommande de lire l'intégralité des premiers chapitres pour avoir une idée de la façon dont un programme Windows old-school devrait être structuré.

Questions connexes