2011-03-31 8 views
2

C#의 사용자 지정 컨트롤에 대한 부드러운/애니메이션 스크롤을 구현하고 싶습니다..NET에서 부드러운 스크롤을 구현하는 방법

http://www.kryogenix.org/code/browser/smoothscroll/#p0

내 첫번째 생각은 목표 지점으로 스크롤바를 이동하지만 중간 지점에서 중지됩니다 : 나는 다음과 같은 자바 스크립트 예제와 비슷한 무언가를 원한다.

public void SetSrollValue(int x) 
{ 
    // assume right scrolling 
    float step = x/10; 

    while (scroll.Value < x) 
    { 
     scroll.Value += step; 
    } 
} 

내 질문

은 다음과 같습니다 :

  • 내가 스레드에서 이것을 구현해야합니다 예를 들어, 이것은 매우 간단한 아이디어인가?
  • 이 원활하게 페인트되는 어떤 좋은 예를 알고있는 경우에, 기사, 제발 수 당신이 제공 링크 안내 또는 이와 유사한,

그래서 (나는 그래 난 두 번 버퍼가 내 컨트롤에서 활성화 한 경우 있다고 가정) 이리?

미리 감사드립니다.

+1

지나치게 모호합니다. 어떤 종류의 통제인가? ScrollableControl에서 파생되고 사용자 고유의 OnPaint() 메서드를 구현할 때만 합리적인 작업을 수행 할 수 있습니다. 사용자로부터 스크롤 바를 제어하는 ​​것은 합리적이지 않습니다. –

+0

@Hans : 네, 컨트롤이 소유자가 그려져 있고, OnPait()을 구현하고 제 스크롤 막대도 관리합니다. 나는 스무딩 스크롤을 구현하는 샘플만을 찾고 있습니다. –

답변

3

컨트롤 스크롤의 내용을 만들려면 AutoScrollPosition의 값을 e.Graphics.TranslateTransform()에 전달합니다. 그것은 당신의 가치입니다, 당신이 전달하는 가치를 바꾸십시오.

OnTransform 메서드에서 호출 할 수 있도록 e.Graphics를 전달하면서 OnPaint 메서드에서 호출하는 메서드를 사용하여 컨트롤의 AutoScrollPosition 값을 관찰하는 작은 도우미 클래스를 작성합니다. 변경 사항이 표시되면 Environment.TickCount를 기록하고 내부 'scrollBusy'플래그를 설정하고 15 밀리 초 타이머를 시작하십시오. 각 타이머 틱에서 메서드를 다시 호출 할 때 TranslateTransform에 대한 새 값을 계산할 수 있도록 컨트롤의 Invalidate() 메서드를 호출합니다. 원래의 스크롤 위치에서부터 목표 스크롤 위치까지의 증가분을 계산합니다 (예 : 250 msec).

관련 문제