在文本框里输入字符串,怎样获得光标的位置呀?

解决方案 »

  1.   

    Text1.SelStart就是光标的位置!!!
      

  2.   

    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
                    ByVal hWnd As Long, _
                    ByVal wMsg As Long, _
                    ByRef wParam As Long, _
                    ByRef lParam As Long _
                    ) As Long'得到光标所在行列数
    Private Const EM_LINEFROMCHAR = &HC9
    Private Const EM_LINEINDEX = &HBB
    Private Const EM_GETSEL = &HB0''
    ''an edit control or a rich edit control
    ''
    ''
    Public Function GetColRowPos(ByVal hWnd As Long, ByRef osColPos As String, ByRef osRowPos As String) As Integer
    On Error GoTo GetColRowPos_Error    GetColRowPos = STS_NORMAL    Dim LPos                As Long
        Dim lX                  As Long
        Dim lY                  As Long
        Dim lBegin              As Long
        Dim lEnd                As Long
        
        osColPos = ""
        osRowPos = ""
       
    '    得到当前光标所在位置字符的序号
        LPos = SendMessage(hWnd, EM_LINEINDEX, ByVal -1, ByVal 0)
    '    得到指定字符序号的字符所在行数 (基于0)
        lY = SendMessage(hWnd, EM_LINEFROMCHAR, ByVal LPos, ByVal 0)
    '    得到所在位置的开始/结束字符序号
        Call SendMessage(hWnd, EM_GETSEL, lBegin, lEnd)
        lX = lBegin - LPos
        
        If lX = 0 Then
            osColPos = "0"
        Else
            osColPos = Format(lX, "##,###")
        End If
        osRowPos = Format(lY + 1, "##,###")
        
        GoTo WayOut
    GetColRowPos_Error:
        gsErrModule = "GetColRowPos"
        Call ErrorProc
    ErrOut:
        GetColRowPos = STS_ERROR
    WayOut:
    End Function
    --------------------------
    Private Sub RTxtBox1_SelChange()
        Dim LsRow               As String
        Dim lsCol               As String    Call GetColRowPos(RTxtBox1.hWnd, lsCol, LsRow)    StatusBar1.Panels(3).Text = LsRow
        StatusBar1.Panels(4).Text = lsColEnd Sub
      

  3.   

    text1.selstart=i
    来定位到第几个字符的位置,但要获得不太容易也许得用API吧。
      

  4.   

    把你的列表框重新放在一个容器上比如图片框定位到你的光标位置。
    然后从列表中选出你的项目。在用selstart的属性来重新定位你的光标位置。。
      

  5.   

    '可直接活动文本框行,列位置
    Option Explicit
    Const EM_GETSEL = &HB0
    Const EM_LINEFROMCHAR = &HC9
    Const EM_LINEINDEX = &HBBPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPublic Sub GetCaretPos(ByVal TextHwnd As Long, LineNo As Long, ColNo As Long)Dim I As Long, j As Long
    Dim lParam As Long, wParam As Long
    Dim k As Long'首先向文本框传递EM_GETSEL消息以获取从起始位置到
    '光标所在位置的字符数I = SendMessage(TextHwnd, EM_GETSEL, wParam, lParam)
    j = I / 2 ^ 16'再向文本框传递EM_LINEFROMCHAR消息根据获得的字符
    '数确定光标以获取所在行数LineNo = SendMessage(TextHwnd, EM_LINEFROMCHAR, j, 0)
    LineNo = LineNo + 1'向文本框传递EM_LINEINDEX消息以获取所在列数k = SendMessage(TextHwnd, EM_LINEINDEX, -1, 0)
    ColNo = j - k + 1
    End SubPrivate Sub Form_Load()
    Dim LineNo As Long, ColNo As LongCall GetCaretPos(Text1.hwnd, LineNo, ColNo)
    Label1.Caption = LineNo
    Label2.Caption = ColNo
    End SubPrivate Sub Form_Resize()
    Text1.Width = Me.ScaleWidth
    End SubPrivate Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
    Dim LineNo As Long, ColNo As LongCall GetCaretPos(Text1.hwnd, LineNo, ColNo)
    Label1.Caption = LineNo
    Label2.Caption = ColNo
    End SubPrivate Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim LineNo As Long, ColNo As LongCall GetCaretPos(Text1.hwnd, LineNo, ColNo)
    Label1.Caption = LineNo
    Label2.Caption = ColNo
    End Sub