none
請問如何得知 RichTextBox 的 Scroll Bar 目前位置? RRS feed

  • 問題

  • 各位好:

     

    請問,我在 RichTextBox 中寫了一堆文字,想要讓使用者捲到最下面時,OK 的 button 才 Enabled.

    那要如何做?

    我查不到如何檢視 Scroll Bar 目前位置的方法...

     

    謝謝。

    2007年9月27日 上午 08:33

解答

  • HI    Streit Huang :

     

    下面的程式碼 範例 我測試過 了 沒問題

     

    給你參考看看 ︿︿

     

     

    程式碼區塊

    Public Class Form1
        '===================================================================
        ' for NativeWindow and PostMessageA
        '===================================================================
        Private Const WM_HSCROLL = &H114
        Private Const WM_VSCROLL = &H115
        Private Const WM_MOUSEWHEEL = &H20A
        Private Const WM_COMMAND = &H111
        Private Const WM_USER = &H400

        '===================================================================
        ' for GetScroll and PostMessageA
        '===================================================================
        Private Const SBS_HORZ = 0
        Private Const SBS_VERT = 1
        Private Const SB_THUMBPOSITION = 4

        '===================================================================
        ' API Function: GetScrollPos
        '===================================================================
        Private Declare Function GetScrollPos Lib "user32" Alias "GetScrollPos" ( _
             ByVal hwnd As IntPtr, _
             ByVal nBar As Integer) As Integer


        '===================================================================
        ' API Function: GetScrollRange
        '===================================================================
        Private Declare Function GetScrollRange Lib "user32" ( _
                 ByVal hwnd As IntPtr, _
                 ByVal nBar As Integer, _
                 ByRef lpMinPos As Integer, _
                 ByRef lpMaxPos As Integer) As Integer


     
       

      
        Private Sub RichTextBox1_VScroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.VScroll

            Dim RTB1Position As Integer
            Dim minpos, maxpos As Integer

            RTB1Position = GetScrollPos(RichTextBox1.Handle, SBS_VERT)


            GetScrollRange(RichTextBox1.Handle, SBS_VERT, minpos, maxpos)

            maxpos = maxpos - RichTextBox1.ClientRectangle.Height

            ' 判斷是否 Scroll Bar 捲到最下面時,才把 button 給 enable.
            If (RTB1Position >= maxpos) and  (Me.Button1.Enabled = False) Then
                Me.Button1.Enabled = True
            End If

        End Sub
    End Class

     

     

     

    2007年9月28日 上午 04:52
  • HI    Streit Huang :

     

    是的 這是使用  Windows API  方式   ^^

     

    如你所說 同時要瞭解 Windows API  與 NET 類別庫

    實在是 沈重的負擔 

    而且不斷的有新的東西要吸收 @@

    沒辦法  這就是 程式開發人員 的 宿命 

     

    至於 要如何來學習使用Windows API  呢 ? 那就先拿 VB6 來練一練 吧 ︿︿

     

     

     

     

     

     

     

     

    2007年9月28日 上午 05:30

所有回覆

  •  

    參考看看 ︿︿

     

    RichTextBox .VerticalOffset 屬性    

     

     Gets or sets the vertical scroll position. (繼承自 TextBoxBase)。

    屬性值

    A floating-point value that specifies the vertical scroll position, in device-independent units (1/96th inch per unit). Setting this property causes the text editing control to scroll to the specified vertical offset. Reading this property returns the current vertical offset. The value of this property is 0.0 if the text editing control is not configured to support scrolling. This property has no default value.

     

    程式碼區塊
     
     myTB1.Text = "ExtentHeight is currently " + myTextBox.ExtentHeight.ToString()     
     myTB2.Text = "ExtentWidth is currently " + myTextBox.ExtentWidth.ToString()    
     myTB3.Text = "HorizontalOffset is currently " + myTextBox.HorizontalOffset.ToString()
     myTB4.Text = "VerticalOffset is currently " + myTextBox.VerticalOffset.ToString()
     myTB5.Text = "ViewportHeight is currently " + myTextBox.ViewportHeight.ToString()
     myTB6.Text = "ViewportWidth is currently " + myTextBox.ViewportWidth.ToString()    
     
     
     

     

     

    2007年9月27日 上午 08:48
  • 謝謝您。

     

    不過... 不管我用 RichTextBox.VerticalOffset

    或是 RichTextBox.ScrollBars.VerticalOffset

     

    都不行耶...

    2007年9月27日 上午 08:53
  • 我的建議是把 RichTextBox 的ScrollBars 屬性至少為 ForcedVertical 、 ForcedBoth 、Both (起碼要讓垂直捲軸出現)

    然後處理 VScroll 事件,只要 ScrollBar 有拉動就把 Button 的 Enabled 設定為 true。

     

    程式碼區塊

            private void richTextBox1_VScroll(object sender, EventArgs e)
            {
                button1.Enabled = true;
                richTextBox1.VScroll -= new EventHandler(richTextBox1_VScroll);
            }

     

     

    2007年9月27日 上午 10:18
  • 謝謝您。

     

    我發現我犯了一個錯誤。我沒提到我用的是 VS2005。

    我試了半天,在 RichTextBox 裡面,都沒有您所說到的屬性耶... 不論是 VerticalOffset 或是 HorizontalOffset 還是 ExtentWidth/ExtentHight 都沒有, 系統都會說這些不是 RichTextBox 的成員. (這些屬性是那個版本的 VB 才有的?)

     

    另外,因為我的目的是在 RichTextBox 中寫版權宣告,所以要使用者看完才能按 Button. 因此要判斷 Scroll Bar 捲到最下面時,才把 button 給 enable.

    或者,有別的想法來處理呢?

     

    謝謝。

    2007年9月28日 上午 01:39
  •  

    HI   Streit Huang :

     

    請問您 的版本是

    1. Microsoft Visual Basic 6.0 版本

     

    2. Visual Basic . NET  或
        Microsoft Visual  Basic 2005 版本

     

     

    RichTextBox 類別 VerticalOffset 或是 HorizontalOffset 屬性是  屬於 .NET Framework 類別庫
    2007年9月28日 上午 01:54
  • HI    Streit Huang :

     

    下面的程式碼 範例 我測試過 了 沒問題

     

    給你參考看看 ︿︿

     

     

    程式碼區塊

    Public Class Form1
        '===================================================================
        ' for NativeWindow and PostMessageA
        '===================================================================
        Private Const WM_HSCROLL = &H114
        Private Const WM_VSCROLL = &H115
        Private Const WM_MOUSEWHEEL = &H20A
        Private Const WM_COMMAND = &H111
        Private Const WM_USER = &H400

        '===================================================================
        ' for GetScroll and PostMessageA
        '===================================================================
        Private Const SBS_HORZ = 0
        Private Const SBS_VERT = 1
        Private Const SB_THUMBPOSITION = 4

        '===================================================================
        ' API Function: GetScrollPos
        '===================================================================
        Private Declare Function GetScrollPos Lib "user32" Alias "GetScrollPos" ( _
             ByVal hwnd As IntPtr, _
             ByVal nBar As Integer) As Integer


        '===================================================================
        ' API Function: GetScrollRange
        '===================================================================
        Private Declare Function GetScrollRange Lib "user32" ( _
                 ByVal hwnd As IntPtr, _
                 ByVal nBar As Integer, _
                 ByRef lpMinPos As Integer, _
                 ByRef lpMaxPos As Integer) As Integer


     
       

      
        Private Sub RichTextBox1_VScroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.VScroll

            Dim RTB1Position As Integer
            Dim minpos, maxpos As Integer

            RTB1Position = GetScrollPos(RichTextBox1.Handle, SBS_VERT)


            GetScrollRange(RichTextBox1.Handle, SBS_VERT, minpos, maxpos)

            maxpos = maxpos - RichTextBox1.ClientRectangle.Height

            ' 判斷是否 Scroll Bar 捲到最下面時,才把 button 給 enable.
            If (RTB1Position >= maxpos) and  (Me.Button1.Enabled = False) Then
                Me.Button1.Enabled = True
            End If

        End Sub
    End Class

     

     

     

    2007年9月28日 上午 04:52
  • 謝謝您。

     

    我用的是 Visual Studio 2005 的 Visual Basic 2005.

    您的寫法已經超出我的理解能力了。但他的確可以運作。

    請問這是跟 Windows API 溝通的結果嗎?

    應該要閱讀哪些書籍來學習呢?

     

    再次感謝您。

    2007年9月28日 上午 05:17
  • HI    Streit Huang :

     

    是的 這是使用  Windows API  方式   ^^

     

    如你所說 同時要瞭解 Windows API  與 NET 類別庫

    實在是 沈重的負擔 

    而且不斷的有新的東西要吸收 @@

    沒辦法  這就是 程式開發人員 的 宿命 

     

    至於 要如何來學習使用Windows API  呢 ? 那就先拿 VB6 來練一練 吧 ︿︿

     

     

     

     

     

     

     

     

    2007年9月28日 上午 05:30