Option Explicit
Private Const EM_GETSEL = &HB0
Private Const EM_LINEFROMCHAR = &HC9
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 Sub Form_Load()
Dim lineno As Long, colno As Long
Call getCaretPos(Text1.hwnd, lineno, colno)
Label1.Caption = lineno
Label2.Caption = colno
End Sub
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 Sub
Private Sub Form_Resize()
Text1.Width = Me.ScaleWidth
End Sub
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
Dim lineno As Long, colno As Long
Call getCaretPos(Text1.hwnd, lineno, colno)
Label1.Caption = lineno
Label2.Caption = colno
End Sub
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single , Y As Single)
Dim lineno As Long, colno As Long
Call getCaretPos(Text1.hwnd, lineno, colno)
Label1.Caption = lineno
Label2.Caption = colno
End Sub