GDI+ double mise en tampon en C++
Je n'ai pas écrit quoi que ce soit avec GDI pour un certain temps maintenant (et jamais avec GDI+), et je suis en train de travailler sur un projet amusant, mais pour la vie de moi, je peux pas comprendre comment le double tampon GDI+
void DrawStuff(HWND hWnd) {
HDC hdc;
HDC hdcBuffer;
PAINTSTRUCT ps;
hdc = BeginPaint(hWnd, &ps);
hdcBuffer = CreateCompatibleDC(hdc);
Graphics graphics(hdc);
graphics.Clear(Color::Black);
//drawing stuff, i.e. bunnies:
Image bunny(L"bunny.gif");
graphics.DrawImage(&bunny, 0, 0, bunny.GetWidth(), bunny.GetHeight());
BitBlt(hdc, 0,0, WIDTH , HEIGHT, hdcBuffer, 0,0, SRCCOPY);
EndPaint(hWnd, &ps);
}
Les travaux ci-dessus (le tout rend très bien), mais il scintille. Si je change Graphics graphics(hdc);
à Graphics graphics(hdcBuffer);
, je ne vois rien (bien que je devrais être bitblt avec le tampon->hWnd hdc en bas).
Mon message pipeline est correctement configuré (WM_PAINT appels DrawStuff), et je suis en forçant un message WM_PAINT chaque boucle du programme en appelant RedrawWindow(window, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW);
Je vais probablement sur la mauvaise voie pour ce faire, des idées? La documentation MSDN est cryptique au mieux.
OriginalL'auteur David Titarenco | 2010-03-18
Vous devez vous connecter pour publier un commentaire.
CreateCompatibleDC(hdc)
crée un DC avec une 1x1 pixel bitmap monochrome comme sa surface de dessin. Vous devez égalementCreateCompatibleBitmap
et sélectionnez l'image bitmap dans le hdcBuffer si vous souhaitez un dessin surface plus grande que celle.Edit:
le scintillement causé par WM_ERASEBKGND, quand vous faites cela
À l'intérieur de l'appel à BeginPaint, Windows envoie votre WndProc un WM_ERASEBKGND message s'il pense que le fond doit être redessiné, si vous ne le manipulez pas ce message, puis DefWindowProc gère en remplissant la peinture rectangle avec votre classe à la brosse, donc pour éviter le scintillement, vous devez manipuler et retourner la valeur TRUE.
Windows pense que votre arrière-plan doit être effacé parce que vous dites qu'il faut, c'est ce que
RDW_ERASE
, de sorte que vous devriez le laisser hors de votreRedrawWindow
appelOriginalL'auteur John Knoeller
vous pouvez essayer de la manière suivante...
Ne pas cette fuite de la pMemBitmap?
OriginalL'auteur ali hwang
Vous manipulez WM_ERASEBKGND? Je crois qu'il est appelé juste avant WM_PAINT et généralement blits la fenêtre de la couleur d'arrière-plan qui vous probablement ne voulez pas faire.
OriginalL'auteur C. Dragon 76