2009-10-25 5 views

답변

2

나는 PInvoke없이 이것을 할 방법을 모른다. PInvoke를 사용하여 GetScrollPos으로 전화 할 수 있습니다.

시도해 볼 수 있습니다.

1 단계 : 표준 RichTextBox를 확장하여 사용자 지정 RichTextBox 컨트롤을 만듭니다.

Imports System 
Imports System.Collections.Generic 
Imports System.Text 
Imports System.Runtime.InteropServices 
Imports System.Windows.Forms 

Namespace WindowsFormsApplication1 

    Public Class MyRichTextBox 
     Inherits RichTextBox 
     <DllImport("user32.dll", CharSet:=CharSet.Auto)> _ 
     Public Shared Function GetScrollPos(ByVal hWnd As IntPtr, ByVal nBar As Integer) As Integer 
     End Function 

     <DllImport("user32.dll")> _ 
     Private Shared Function SetScrollPos(ByVal hWnd As IntPtr, ByVal nBar As Integer, ByVal nPos As Integer, ByVal bRedraw As Boolean) As Integer 
     End Function 

     Private Const SB_HORZ As Integer = &H0 
     Private Const SB_VERT As Integer = &H1 

     ''' <summary> 
     ''' Gets and Sets the Horizontal Scroll position of the control. 
     ''' </summary> 
     Public Property HScrollPos() As Integer 
      Get 
       Return GetScrollPos(DirectCast(Me.Handle, IntPtr), SB_HORZ) 
      End Get 
      Set(ByVal value As Integer) 
       SetScrollPos(DirectCast(Me.Handle, IntPtr), SB_HORZ, value, True) 
      End Set 
     End Property 

     ''' <summary> 
     ''' Gets and Sets the Vertical Scroll position of the control. 
     ''' </summary> 
     Public Property VScrollPos() As Integer 
      Get 
       Return GetScrollPos(DirectCast(Me.Handle, IntPtr), SB_VERT) 
      End Get 
      Set(ByVal value As Integer) 
       SetScrollPos(DirectCast(Me.Handle, IntPtr), SB_VERT, value, True) 
      End Set 
     End Property 
    End Class 
End Namespace 

표준 RichTextBox에는 HScrollPos 및 VScrollPos라는 두 가지 속성이 추가됩니다. 이러한 속성을 사용하면 컨트롤에서 가로 및 세로 스크롤 막대 위치를 가져 와서 설정할 수 있습니다.

2 단계 : 테스트 양식을 만들고 컨트롤을 테스트 해보십시오.

사용자 지정 컨트롤과 동일한 프로젝트에서 Winform을 만듭니다. 테스트 폼에 사용자 지정 컨트롤을 놓고 폼에 단추를 추가합니다. 폼의 Click 이벤트에 다음 코드를 추가하여 사용자 지정 컨트롤의 세로 스크롤 위치를 봅니다.

  1. 수직 스크롤 막대를 표시하는 컨트롤이 현재 사용하지 않는 경우 , HScrollPos에 통화가 프로그램을 충돌합니다 :

    Console.WriteLine(myRichTextBox1.VScrollPos) 
    

    몇 가지를 감시합니다. 이 문제를 해결하기 위해 방법이 몇 가지 있습니다 ( 스크롤 막대가 표시되어 속성을 확인하거나 항상 세로 스크롤 막대를 표시하는 등).

  2. 제어 (및 가능한 형태) 프로그램을 중단 할 수있는 VScrollPos 설정 (텍스트 컨텐츠 컨트롤의 에서하지 에 언급 변경) 크기 또는 가 위치로 복원 할 방법에 따라 VScrollPos 값이 일 때 이 저장되었습니다.

  3. 나는이 코드를 한번도 사용하지 않았습니다. 나는 귀하의 질문은 흥미로 우며 리서치의 약간의 리서치를 내 대답으로 생각해 냈습니다.

+0

멋진 작품! 정말 고마워! 그 방법에 대한 래퍼를 만들지 않은 이유가 궁금하다. 나는 한 번 이상 upvote 수 있었으면 좋겠다! – Cyclone

+0

좋습니다, 도움이 되었기 때문에 기쁩니다. –

+0

안녕하세요 :) 귀하의 코드를 시도하고 위대한 가치를 얻기위한 새로운 가치를 설정하는 그것은 단지 그 컨트롤의 스크롤바를 다시 그다지 나던 doesnt :(당신이 도울 수 있을까? http : // pastesite .com/22927 고마워. :) – FeRtoll

관련 문제