2013-01-04 9 views
7

Próbuję zaimplementować podwójne buforowanie, ale wygląda na to, że nie działa, tzn. Grafika nadal migocze.Podwójne buforowanie? Win32 C++

WM_PAINT zostaje wywołany za każdym razem, gdy mysz się porusza. (WM_MOUSEMOVE)

Pasted WM_PAINT poniżej:

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

Odpowiedz

9

Dodaj następującą procedurę obsługi:

case WM_ERASEBKGND: 
    return 1; 

Powodem działa się tak, ponieważ ta wiadomość jest wysyłana przed malowaniem, aby upewnić się, że malowanie odbywa się na tło klasy okna. Miganie przebiega tam iz powrotem między tłem a tym, co zostało nad nim zamalowane. Po zaprzestaniu malowania tło przestaje być w konflikcie z tym, co zostało namalowane, co obejmuje wypełnienie okna jednolitym kolorem, więc i tak nadal będzie tło.

Powiązane problemy