none
RichTextBox游標座標與總行數 RRS feed

  • 問題

  • 各位大大
    我的系統是Win XP  我使用VB2005寫一程式
    我使用了一個RichTextBox與兩個Label
    我想要讓使用者在RichTextBox中所點選到的游標位置,都能夠顯示當前游標的位置 並且能夠得到總行數
    講此資訊顯示在Label上面。

    我遇到的問題是,不管我移動到哪個位置上,Label顯示的值都是0。

    另外想請教總行數要怎麼求得?

    程式如下:

    Public Class Form1
    
    	Private Declare Function GetCaretPos Lib "user32" (ByRef lpPoint As Point) As Integer
    	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    		Dim pt As Point
    		GetCaretPos(pt)
    		Label1.Text = pt.X
    		Label2.Text = pt.Y
    
    	End Sub
    End Class
    


    2012年2月21日 上午 01:15

解答

  • 您好

    因為你放在 Form_Load 事件,邏輯是有問題的,參考以下代碼看看

    Public Class Form1
    
        Private Declare Function GetCaretPos Lib "user32" (ByRef lpPoint As Point) As Integer
    
        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
            Dim pt As Point
            GetCaretPos(pt)
            Label1.Text = pt.X
            Label2.Text = pt.Y
            MyBase.WndProc(m)
        End Sub
    End Class


    歡迎參觀我的Blog.NET菜鳥自救會

    2012年2月21日 上午 01:33
    版主
  • 可以考慮直接使用功能較強的RichTextBox控制項, 因其支援CursorPositionChanged事件, 請參考:Richer RichTextBox
    2012年2月21日 上午 03:21

所有回覆

  • 您好

    因為你放在 Form_Load 事件,邏輯是有問題的,參考以下代碼看看

    Public Class Form1
    
        Private Declare Function GetCaretPos Lib "user32" (ByRef lpPoint As Point) As Integer
    
        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
            Dim pt As Point
            GetCaretPos(pt)
            Label1.Text = pt.X
            Label2.Text = pt.Y
            MyBase.WndProc(m)
        End Sub
    End Class


    歡迎參觀我的Blog.NET菜鳥自救會

    2012年2月21日 上午 01:33
    版主
  • 可以考慮直接使用功能較強的RichTextBox控制項, 因其支援CursorPositionChanged事件, 請參考:Richer RichTextBox
    2012年2月21日 上午 03:21
  • 各位大大好

    我把游標位置讀取放到timer中

    而我把RichTextBox控制項設定

             RichTextBox1.Multiline = True
            RichTextBox1.ScrollBars = RichTextBoxScrollBars.ForcedBoth

    如此我的RichTextBox可以捲動

    但是p.y座標跑到RichTextBox所設定的Size高度後,數值便定住不再增加

    請問這可以怎麼解決呢?

    另外我希望座標一次+1就好,而這座標位置p.y部分差一個位置會一次+16

    p.x部分,中文差一個位置一次+12,英文差一個位置一次+8,數字差一個位置一次+3

    我要怎麼做才能夠讓他一次只+1?

    	Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    		Dim p As New Point
    		GetCaretPos(p)	'取得游標位置
    		Label1.Text = p.x
    		Label2.Text = p.y
    	End Sub


    2012年2月21日 上午 08:39
  • 各位大大好

    游標移動一格不是+1的情形我已經解決了,我是用除上一個固定值,然後取Math.Ceiling

    但是捲動部分,假設我的RichTextBox可以顯示28行,初始值為1,而我的游標移動一格+1

    當我移動28格,累加27後,游標跑到RichTextBox的底部,當我再按下移動時,捲動軸移動了

    但是

    GetCaretPos(p)   
    Label1.Text = p.y的值卻都固定不動,想請教這部分可以怎麼解決?

    2012年2月22日 上午 01:56
  • 各位大大好

    關於RichTextBox顯示行列的問題我已經解決了

    由於不是用API的方法所以不會有捲動時GetCaretPos(p)  的p.y不會累加的情形

    我是用

    RichTextBox.GetLineFromCharIndex、RichTextBox.SelectionStart以及RichTextBox.GetFirstCharIndexFromLine

    搜尋一下就可以找到相關的用法,想法如下:

    取Y軸的值:控制項文字內的指定字元位置擷取行號
    例如:   RichTextBox.GetLineFromCharIndex(RichTextBox.SelectionStart))

    取Y軸的值:(起始值+x軸指定的位置(游標位置)-(x軸第一個位置(最左邊))

    2012年2月23日 上午 05:31