谢谢

解决方案 »

  1.   

    本框中光标位置的获得
    作者:陈锐 
    在很多的编辑软件中有这样一个功能,即当用户在编辑区中输入字符或者按动鼠标使得光标的位置改变时,在编辑软件下方的状态栏中就能显示出光标所在位置的行和列的值。下面就介绍如何用VB编程实现在文本框中的这一功能。 
      首先,在Form中添加一个文本框(richTextBox),将其MultiLine属性设置为True,以便输入多行文本;再在Form中添加两个标题栏(Label),以便显示光标位置;然后,在Form的代码窗口中添加程序中的代码。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 Long''获取光标的位置的所在行和列
    Public 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(richTextBox.hwnd, LineNo, ColNo)
    Label1.Caption = LineNo
    Label2.Caption = ColNo
    End SubPrivate Sub Form_Resize()
    Text1.Width = Me.ScaleWidth
    End SubPrivate Sub richTextBox_KeyUp(KeyCode As Integer, Shift As Integer)
    Dim LineNo As Long, ColNo As LongCall GetCaretPos(richTextBox.hwnd, LineNo, ColNo)
    Label1.Caption = LineNo
    Label2.Caption = ColNo
    End SubPrivate Sub richTextBox_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim LineNo As Long, ColNo As LongCall GetCaretPos(richTextBox.hwnd, LineNo, ColNo)
    Label1.Caption = LineNo
    Label2.Caption = ColNo
    End SubPrivate Declare Function SendMessageBynum& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
    Const EM_LINEINDEX = &HBB   '判断指定行第一个字符的编号Private Sub Command1_Click()
      Text1.SelStart = SendMessageBynum(richTextBox.hwnd, EM_LINEINDEX, 3, 0)  '其中3表示第4行
      Text1.SetFocus
    End Sub