2013-01-04 11 views
7

Ich versuche, doppelte Pufferung zu implementieren, aber es scheint nicht zu arbeiten, d. H. Die Grafik flackert immer noch.Doppelte Pufferung? Win32 C++

Der WM_PAINT wird jedes Mal aufgerufen, wenn sich die Maus bewegt. (WM_MOUSEMOVE)

Pasted WM_PAINT unter:

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

Antwort

9

Fügen Sie die folgende Prozedur:

case WM_ERASEBKGND: 
    return 1; 

Der Grund, es funktioniert, weil diese Nachricht gesendet wird, bevor dieses Gemälde, um sicherzustellen, Malerei auf das getan wird Fenster Klassenhintergrund. Das Blinken geht zwischen dem Hintergrund und dem, was darüber gemalt ist, hin und her. Sobald der Hintergrund aufgehört hat, zu malen, hört es auf, mit dem, was darüber gemalt wird, in Konflikt zu treten, was das Füllen des Fensters mit einer einfarbigen Farbe einschließt, so dass es immer noch einen Hintergrund gibt.