你可以用listbox控件代替textbox, 这样比较好写程序。

解决方案 »

  1.   

    向cuizm(射天狼 http://www.j2soft.cn/)学习了:)
    再加上从网上Copy来的一个函数,当文本框内存在自动折行的超长行时,效果与cuizm的稍有不同
    Private Const EM_LINEFROMCHAR = &HC9
    Private Const EM_GETLINE = &HC4
    Private Const EM_LINELENGTH = &HC1
    Private Const EM_LINEINDEX = &HBB
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)Private Sub Command1_Click()
        Dim nLine As Long
        Dim strContent As String
        
        strContent = Text1.Text
        nLine = SendMessage(Text1.hWnd, EM_LINEFROMCHAR, Text1.SelStart, 0)
        TB_GetLine Text1.hWnd, nLine, strContent
        MsgBox strContent
    End SubSub TB_GetLine(ByVal hWnd As Long, ByVal whichLine As Long, Line As String)
        Dim length As Long, bArr() As Byte, bArr2() As Byte, lc As Long
        lc = SendMessage(hWnd, EM_LINEINDEX, whichLine, ByVal 0&)
        length = SendMessage(hWnd, EM_LINELENGTH, lc, ByVal 0&)
        If length > 0 Then
            ReDim bArr(length + 1) As Byte, bArr2(length - 1) As Byte
            Call RtlMoveMemory(bArr(0), length, 2) '准备一个存储器,传递消息之前先在存储器的前两个字节填入存储器的长度
            Call SendMessage(hWnd, EM_GETLINE, whichLine, bArr(0))
            Call RtlMoveMemory(bArr2(0), bArr(0), length)
            Line = StrConv(bArr2, vbUnicode)
        Else
            Line = ""
        End If
    End Sub