2012-11-16 7 views
3

폼에 간단한 패널이 있고 AutoScrollMinSize 및 AutoScroll을 사용하여 내 패널에 일부 스크롤바를 가져옵니다. 모두 정상입니다.Scroll 이벤트와 Paint 이벤트 사이의 어긋남과 어쩌면 뭔가있는 것

또한 전체 패널 영역을 무효화하는 데 사용하는 Scroll 이벤트가 있는데, 이는 왼쪽/오른쪽, 위/아래로 스크롤 할 때 필요한 비트 만 무효화하는 것처럼 보입니다. 이 외에도 나는 패널과 같은 크기의 BufferedGraphics를 사용하고 있는데, 스크롤 바가 존재하지 않는 것처럼 전체 패널을 그릴 수 있기를 원하는 경우 .Render (e.Graphics)를 사용합니다. .

이제 내가 가지고있는 문제는 화면을 스크롤하고 내용을 칠할 때 시각적 인 문제가있는 것처럼 보입니다. 이전에 익숙하지 않은 여분의 그리기/설정 단계가 있기 때문입니다 Scroll 이벤트가 불려지거나 호출되는 Paint 이벤트와의 사이에 Scroll 이벤트가 호출됩니다.

페인트 방법 내에 무효화 패널이있는 경우 문제는 보이지 않지만이 문제를 숨기는 여러 번 호출되는 페인트 이벤트와 관련이 있습니다.

당신이 스크롤 할 때, 두포 밑에있는 어떤 것이 이미 존재하는 큰 사각형 blit 내용을 이동 시키면 채워질 필요가있는 영역의 사각형이 무효화됩니다.

이 경우,이 단계를 억제하거나 지연을 없애기 위해 누락 된 일부 설정을 억제하므로 어쨌든이 주변에 있습니까?

추신 : 나는 또한 빈 스텁 인 OnPaintBackground 메서드를 재정의합니다.

+0

두 개의 버퍼링 구성표를 회전하고 스크롤 위치에 관계없이 전체 패널을 그리려는 시도는 그림을 느리게 만드는 매우 좋은 방법입니다. 그냥 하지마. –

답변

2

좋아, 드문 경우에 도움이 필요한 경우 내 자신의 질문에 답하십시오. 누군가가 LockWindowUpdate를 언급하면서 WM_SETREDRAW와이 포스트 SuspendDrawing으로 이동하게되었습니다. 이제 전체 패널을 페인트 할 수있는 기능이 부드럽게 나타납니다. Scroll 이벤트를 사용하면 다음과 같은 작업을 수행 할 수 있습니다. YMMV.

[DllImport("user32.dll")] 
    private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); 
    private const int WM_SETREDRAW = 0xB; 

    private void PanelView_Scroll(object sender, ScrollEventArgs e) 
    { 
     Control control = sender as Control; 
     if (control!=null) 
     { 
      if (e.Type == ScrollEventType.ThumbTrack) 
      { 
       // Enable drawing 
       SendMessage(control.Handle, WM_SETREDRAW, 1, 0); 
       // Refresh the control 
       control.Refresh(); 
       // Disable drawing        
       SendMessage(control.Handle, WM_SETREDRAW, 0, 0); 
      } 
      else 
      { 
       // Enable drawing 
       SendMessage(control.Handle, WM_SETREDRAW, 1, 0); 
       control.Invalidate(); 
      } 
     } 
    } 
+0

왜 투표가 늦습니까? 개선 된 답변에 감사드립니다. – Niksan