2013-01-04 2 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; 

는이 메시지가 그 그림을 확인하기 위해 그림 전에 전송되기 때문에 작동하는 이유는 이루어집니다 창 클래스의 배경. 깜박이는 것은 배경과 그 위에 페인트 칠 된 것 사이를왔다 갔다합니다. 일단 배경이 그려지기를 멈 추면 창 위에 단색으로 채우는 것을 포함하여 그 위에 그려지는 것과 충돌을 멈추기 때문에 어쨌든 배경이 남아있게됩니다.