2013-01-04 141 views
7

我想实现双缓冲,但它似乎不工作,即图形仍然闪烁。双缓冲? Win32 C++

当鼠标移动时,WM_PAINT每次被调用。 (WM_MOUSEMOVE)

下面

粘贴WM_PAINT:

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

回答

9

添加以下处理:

case WM_ERASEBKGND: 
    return 1; 

它的工作原理是,因为这个消息是画,以确保涂装前发送的原因是在做窗口类的背景。闪烁是在背景和背景之间来回切换的。一旦背景不再被绘制,它就会停止与绘制背景的冲突,其中包括用纯色填充窗口,所以仍然会有背景。