'在Form中添加一个文本框(TextBox),将其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 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
Text1.SelStart = 10 '设置光标在第10个字符处
Text1.Text = Text1.Text & "追加" '在最后追加
'或者
Text1.SelText = "追加" '在光标处追加
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
在文本框中追加:Text1.Text = Text1.Text & "追加的文本"
我觉得用VB写程序的原则是:
1 能用VB基本函数解决的就不要用API
2 能用基本控件解决的就不要用外部控件
3 能用API解决的尽量不要用外部控件
你的写程序原则是对的,尽量不用api