2010-06-06 5 views
1

관련 질문을 검색했지만 필요한 것을 찾을 수 없습니다.RichTextBox Visual Studio에서 세로 스크롤 막대 조작

richtextbox 컨트롤이 있습니다. 세로 스크롤 막대가 특정 위치 (예 : 아래쪽 아래로 90 %)에 도달하면 이벤트를 트리거해야합니다. 나는 부유 한 텍스트 박스를위한 이벤트를 가지고 놀았지만 아직 아무것도 찾지 못했다.

도움을 주시면 감사하겠습니다.

+0

빠른 설명, WPF 또는 WinForms를 사용하고 있습니까? – Dennis

+0

Visual Studio의 WinForms – Kizaru

답변

2

당신은 스크롤 위치를 결정하기 위해 기능

private static double GetRichTextBoxScrolPos(RichTextBox textBox) 
{ 
    if(textBox1.TextLength == 0) return 0; 
    var p1 = textBox.GetPositionFromCharIndex(0); 
    var p2 = textBox.GetPositionFromCharIndex(textBox.TextLength - 1); 

    int scrollPos = -p1.Y; 
    int maxScrolPos = p2.Y - p1.Y - textBox.ClientSize.Height; 

    if(maxScrolPos <= 0) return 0; 

    double d = 100.0 * (double)scrollPos/(double)maxScrolPos; 
    if(d < 0) d = 0; 
    else if(d > 100) d = 100; 

    return d; 
} 

에게 수직 스크롤을 감지하고 사용하는 VScoll 이벤트를 처리 할 수 ​​있습니다. 결과는 %로 표시됩니다 (100 % = 완전히 아래로 스크롤).

중요 사항 :이 기능은 반드시 정확하지는 않지만 결과는 정확합니다. 하단 라인 높이를 측정하여 더욱 향상시킬 수 있습니다 (예 : Graphics 개체 사용). 100 % 신뢰할 수있는 방법은 WinAPI를 사용하여 VScrollBar을 처리하고 위치를 쿼리하는 것이지만 훨씬 더 많은 작업이 필요합니다.

+0

고마워요! 나는 몇 분 안에 그것을 시도 할 것이다 : – Kizaru

+1

좋아, 이것은 작동하는 것 같다. 함수가 이벤트에서 자주 호출되는 유일한 문제입니다. 5 초마다 하나의 통화로 기능을 제한 할 수있는 방법이 있습니까? 그것은 텍스트 상자를 다시 설정하면 거의 무한히 호출 된 것 같습니다. – Kizaru

+0

VScroll 이벤트를 업데이트하려고 할 때 구독을 취소하고 업데이트 후 다시 구독 할 수 있습니다. 시간에 따른 호출 수를 제한해야하는 경우 함수 결과와 호출 시간을 2 개의 변수로 캐시 할 수 있으며 5 초 이내에 호출 된 경우 이전 결과가있는 함수에서 빠르게 복귀 할 수 있습니다. – max