2013-01-04 7 views
7

J'essaye d'implémenter le double tampon mais cela ne semble pas fonctionner, c'est-à-dire que le graphique scintille toujours.Double buffering? Win32 C++

Le fichier WM_PAINT est appelé à chaque fois que la souris se déplace. (WM_MOUSEMOVE)

Collé WM_PAINT ci-dessous:

case WM_PAINT: 
     { 
      hdc = BeginPaint(hWnd, &ps); 
      // TODO: Add any drawing code here... 
      RECT rect; 
      GetClientRect(hWnd, &rect); 
      int width=rect.right; 
      int height=rect.bottom; 

      HDC backbuffDC = CreateCompatibleDC(hdc); 

      HBITMAP backbuffer = CreateCompatibleBitmap(hdc, width, height); 

      int savedDC = SaveDC(backbuffDC); 
      SelectObject(backbuffDC, backbuffer); 
      HBRUSH hBrush = CreateSolidBrush(RGB(255,255,255)); 
      FillRect(backbuffDC,&rect,hBrush); 
      DeleteObject(hBrush); 


      if(fileImport) 
      { 
       importFile(backbuffDC); 
      } 

      if(renderWiredCube) 
      { 
       wireframeCube(backbuffDC); 
      } 

      if(renderColoredCube) 
      { 
       renderColorCube(backbuffDC); 

      } 

      BitBlt(hdc,0,0,width,height,backbuffDC,0,0,SRCCOPY); 
      RestoreDC(backbuffDC,savedDC); 

      DeleteObject(backbuffer); 
      DeleteDC(backbuffDC); 

      EndPaint(hWnd, &ps); 
     } 

Répondre

9

Ajouter le gestionnaire suivant:

case WM_ERASEBKGND: 
    return 1; 

La raison pour laquelle cela fonctionne est parce que ce message est envoyé avant la peinture pour faire en sorte que la peinture se fait sur la l'arrière-plan de la classe de fenêtre. Le clignotement va et vient entre l'arrière-plan et ce qui est peint dessus. Une fois que l'arrière-plan a cessé d'être peint, il cesse d'être en conflit avec ce qui est peint dessus, ce qui inclut le remplissage de la fenêtre avec une couleur solide, de sorte qu'il y aura toujours un arrière-plan de toute façon.