Lpos:=SendMessage(richedit.Handle,EM_LINEFROMCHAR,richedit.SelStart,0);
//得到当前光标所在的行值
Cpos:=SendMessage(richedit.Handle,EM_LINEINDEX,Lpos,0);
//得到当前光标所在行第一个字符前的所有字符个数
Linelength:=SendMessage(richedit.Handle,EM_LINELENGTH,Cpos,0);
//得到当前光标所在行的总字数
Cpos:=richedit.SelStart-Cpos;
//得到当前光标所在的行值
Cpos:=SendMessage(richedit.Handle,EM_LINEINDEX,Lpos,0);
//得到当前光标所在行第一个字符前的所有字符个数
Linelength:=SendMessage(richedit.Handle,EM_LINELENGTH,Cpos,0);
//得到当前光标所在行的总字数
Cpos:=richedit.SelStart-Cpos;
解决方案 »
- 散分,以示感恩!第三帖
- 求一个函数
- 我用ADOQUERY控件和ADOTABLE控件联合使用时,将ADOTABLE控件做为LOOKUP字段的数据源,在ADOQUERY中增加一个字段做为返回的结果,但只要这么
- 菜鸟问题:一个简单的SQL语句
- 如何判断edit控件中输入的必须是中文?
- 急!急!急!
- 动态创建QRLabel2(QRDBText1)怎样放到指定的bands 中啊??
- 一个窗口激活的代码,无法编译,高手指教下。
- 紧急求救,在线等待两小时,解决马上加分。
- 谁能帮我解决这个问题,我将感谢不尽!
- 在一个程序代码当中我想把所有的image换成paintbox怎么设置才最快
- 在三层结构中,我想在客户端体现出主从表的记录,就象两层的一样,主表变化,从表也变化,应该怎么实现??谢谢。
一般的比较完善的文本编辑器一般都有在状态栏中显示当前光标所在行和列的功能。利用SendMessage向TextBox
控件发送编辑控件类型消息。也可以实现这样的功能。下面首先来看程序,然后再分析。
首先在VB中建立一个新工程,并在Form1中加入一个TextBox控件和两个Label控件。将TextBox控件的MultiLine
属性设置为True。然后在Form1的代码窗口中加入如下代码:Option ExplicitPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageW" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
Private Declare Function SendMessageByRef Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, wParam As Long, _
lParam As Long) As Long
Const EM_LINEFROMCHAR = &HC9
Const EM_LINEINDEX = &HBB
Const EM_GETLINE = &HC4
Const EM_GETSEL = &HB0Dim iLineX, iLineY As LongSub GetCurPos(txtA As TextBox)
Dim l, l1, l2 As Long
Dim astr As String * 256
l = SendMessage(txtA.hwnd, EM_LINEINDEX, -1, 0)
iLineY = SendMessage(txtA.hwnd, EM_LINEFROMCHAR, l, 0)
SendMessageByRef txtA.hwnd, EM_GETSEL, l1, l2
iLineX = l1 - l
Label1.Caption = "列:" + Str(iLineX)
Label2.Caption = "行:" + Str(iLineY)
End SubPrivate Sub Form_Load()
Dim iFile
Dim astr As String
Label1.Height = 300: Label2.Height = 300
Text1.Left = 0: Text1.Top = 0
Text1.Text = ""
Label1.Caption = ""
Label2.Caption = ""
iFile = FreeFile
Open "C:\windows\readme.txt" For Input As #iFile
Do
Line Input #iFile, astr
Text1.Text = Text1.Text + astr + vbCrLf
Loop Until EOF(iFile)
Close iFile
End SubPrivate Sub Form_Resize()
Label1.Top = Me.ScaleHeight - 300
Label2.Top = Me.ScaleHeight - 300 Label1.Left = 0: Label2.Left = 1200
Label1.Width = 1200
Label2.Width = 1200
Text1.Width = Me.ScaleWidth
Text1.Height = Me.ScaleHeight - Label1.Height
End SubPrivate Sub Text1_Click()
GetCurPos Text1
End SubPrivate Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
GetCurPos Text1
End Sub
在运行程序前,确保在你的硬盘上有 c:\windows\readme.txt 这个文件。否则程序会出错。然后运行
程序。当在编辑文本时,可以看到在窗口底部可以显示当前光标所在的行、列值。
在上面的程序中。我们首先发送EM_LINEINDEX消息,发送该消息可以返回某一行的第一个字符在整个
文本控件中的位置,如果wParam参数设置为-1,则返回当前行的字符位置。然后发送EM_LINEFROMCHAR,发
送该消息可以根据参数wParam指定的字符位置返回该字符所在的行号,文本第一行的位置为0。这样使用这
两个消息就获得当前光标所在的行号。要取得列号,首先发送EM_GETSEL消息,发送该消息返回当前被选中
文本的起始位置,如果没有文本被选中,则返回当前光标所在字符在文本中的位置。由于上面的EM_LINEINDEX
消息返回的是当前行的第一个字符在文本中的位置。所以将两值相减,就是光标所在字符的列位置。