2013-01-04 23 views
7

Sto cercando di implementare il doppio buffering ma non sembra funzionare, ad esempio il grafico è ancora sfarfallio.Double Buffering? Win32 C++

Il WM_PAINT viene chiamato ogni volta che il mouse si sposta. (WM_MOUSEMOVE)

WM_PAINT incollato qui sotto:

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); 
     } 

risposta

9

Aggiungere il seguente gestore:

case WM_ERASEBKGND: 
    return 1; 

Il motivo per cui funziona è perché questo messaggio viene inviato prima della verniciatura per garantire che la pittura è fatto sul sfondo della classe di finestre. Il lampeggiare va avanti e indietro tra lo sfondo e ciò che è dipinto su di esso. Una volta che lo sfondo ha smesso di essere dipinto, smette di essere in conflitto con ciò che è dipinto su di esso, che include il riempimento della finestra con un colore a tinta unita, quindi ci sarà comunque sempre uno sfondo.