2013-06-05 4 views
0

문제는 내가 그린 선을 그리면 다시 그릴 때마다 화면이 깜박입니다. 나는 그것을 깜박 거리게하지 않는 방법을 알아낼 수 없다. 내 왼쪽 버튼을 사용하여 마우스를 움직일 때 클라이언트 영역을 두 번째로 수백 번 다시 그리는 깜박임이 들리는 것을 이해하지만 어떻게이 문제를 해결할 수 있습니까? 할선을 그릴 때 클라이언트 영역 깜박임

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, 
          WPARAM wParam, LPARAM lParam) 
    { 
    static HDC  hdc; 
    PAINTSTRUCT  ps; 
    RECT   rect; 
    RECT   size; 
    static POINT point1; 
    static POINT point2; 
    static HBRUSH origBrush; 
    static bool drawingLine = false; 

    switch (message) 
     { 

     case WM_CREATE: 
      origBrush = CreateSolidBrush(RGB(0, 0 , 0)); 

      break; 

      case WM_PAINT: 
       hdc = BeginPaint (hwnd, &ps); 

       GetClientRect (hwnd, &rect); 

       GetWindowRect(hwnd, &size); 

       Rectangle(hdc, 10, 10, 80, 80); 

       if(drawingLine == true) 
       { 
        MoveToEx(hdc, point1.x, point1.y, NULL); 
        LineTo(hdc, point2.x, point2.y); 
       } 

       EndPaint (hwnd, &ps); 
       return 0; 

       //Has all the commands that exist in your program. 
      case WM_COMMAND: 
       switch(LOWORD(wParam)) 
       { 
       case ID_COLOR_RED: 
        break; 

       case ID_COLOR_BLUE: 
        break; 

       case ID_COLOR_BLACK: 
        break; 

       case ID_THICKNESS_1: 
        break; 

       case ID_THICKNESS_2: 
        break; 

       case ID_THICKNESS_3: 
        break; 

       } 
       break; 

      case WM_LBUTTONDOWN: 
       drawingLine = true; 
       SelectObject(hdc, GetStockObject(BLACK_BRUSH)); 
       point1.x = LOWORD(lParam); 
       point1.y = HIWORD(lParam); 
       MoveToEx(hdc, point1.x, point1.y, NULL); 
       break; 

      case WM_MOUSEMOVE: 
       point2.x = LOWORD(lParam); 
       point2.y = HIWORD(lParam); 
       InvalidateRect(hwnd, NULL, 1); 
       break; 

      case WM_LBUTTONUP: 
       point2.x = LOWORD(lParam); 
       point2.y = HIWORD(lParam); 

       drawingLine = false; 
       break; 

       //Causes the program to exit. 
      case WM_DESTROY: 
       PostQuitMessage(0); 
       break; 
     } 
+0

이중 버퍼링을 찾습니다. – chris

+0

'WM_ERASEBKGND'를 처리하지 않으면 시스템은 무효화 할 때마다 전체 클라이언트 영역을 지울 것입니다. –

답변

2

중요한 것은 WM_ERASEBKGND에 대응하고 배경의 기본 재 드로잉을 방지하기 위해 true를 반환합니다.

그런 다음 새로운 그림을 그리기 전에 기존 회선을 지워야합니다. 예를 들어 선 아래에서 비트를 저장하고 그 다음 그 선을 그리기 전에 픽셀을 복원 할 수 있으므로 지울 필요가있을 때 픽셀을 복원하여 지울 수 있습니다.

이론상으로는 조금 느리지 만 명백한 대안은 이중 버퍼링을 사용하는 것입니다. 현재 도면을 대략적으로 다루지 만, 화면 밖의 비트 맵에 그리십시오. 그런 다음 화면에서부터 BitBlt를 모두 완료하면됩니다.

관련 문제