奇怪,在我的程序里就会出错,SendMessageByRef txtA.hwnd, EM_GETSEL, l1, l2这个函数返回的l1,l2分别是代表什么意思?l = SendMessage(txtA.hwnd, EM_LINEINDEX, -1, 0)
这个函数在我的程序里每次返回的都是当前行第一列在文本中的位置,在你的例子里每次都返回是0,这个值到底是表示什么意思?我想自己改正这个程序,所以不把代码帖出来了
这个函数在我的程序里每次返回的都是当前行第一列在文本中的位置,在你的例子里每次都返回是0,这个值到底是表示什么意思?我想自己改正这个程序,所以不把代码帖出来了
解决方案 »
- 请问各位高手如何注册csXImageTrial.ocx
- vb中求和问题!在线等1!
- 如何快速地判断两幅图中的不同之处?【续】
- 看是谁容不下这句话,我偏要说: 好怀念以前无限当版主的时候,VB非技术区总是充满阳光和快乐。
- 为什么我的数据库数据显示不出?
- 怎样,在access中存放*.wav文件,怎样用vb读取?
- 急!请问这个程序怎么错误了?应该怎么修改?
- 借用此宝地做个倒计时(下一次生日)的牌子吧,每天mark一下
- 在shell中运行的程序好像跟本就没有正确执行?
- 请教 Bardo ,如何创建一个弹出式菜单并为它设置背景图??最主要的是设置背景图!!
- 请问一个像素对应多少个缇啊?
- 挑战性问题....
l1定义行数,如果设定为-1,那么将返回当前插入符所在的行的第一各字符的索引。
Sub 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 Sub就会总是返回0吗?
另外对于 SendMessageByRef txtA.hwnd, EM_GETSEL, l1, l2 语句获得控件中被选择文本
的起始以及结束位置。l1指的是起始位置,l2指的是结束位置。由于前面
l = SendMessage(txtA.hwnd, EM_LINEINDEX, -1, 0)
语句已经获得了插入符所在行的第一个字符在字符串中的位置,那么用l1-l就可以得到插入
符在该行的那个位置,即列值。
Private Declare Function SendMessageByRef Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, wParam As Long, _
lParam As Long) As Long
里面wParam以及lParam都不是ByVal。而这个SendMessageByRef 在程序中调用:
SendMessageByRef txtA.hwnd, EM_GETSEL, l1, l2
这是因为发送EM_SETSEL函数获得的文本被选择区域的起始以及结束位置是保存在wParam
以及lParam指向的缓冲区的(也就是指针),所以不能使用Byval定义wParam以及lParam。
如果是使用了Byval,那么l1 l2始终为0。那么后面的语句:
iLineX = l1 - l
就会得到负数。
如你所说,L1返回选定文本起始位置,L2返回选定文本结束位置,L是当前行第一列在整个文本中的位置。那么从上往下选定文本,比如从第一行到第二行,选定后,当前行在第二行,那么返回的L值必定比L1值大,因为选定的起始点在第一行,也就是说L在整个文本中的位置大于L1,如果这个时候还用L1-L,就会出现负数,应该是这样写:
if L>L1 then
iLineX=L2-L '如果起始点所在的行在当前行的前面,列数就是结束位置减L
else
iLineX=L1-L '如果起始点所在的行在当前行的后面,列数就是开始位置减L
end if
这样做就不会出现负数了
PS:我另外的程序中L还是总等于零,是不是vb的bug呀
Sub GetCurPos(txtA As RichTextBox)
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
Debug.Print l, l1, l2
Label1.Caption = "列:" + Str(iLineX)
Label2.Caption = "行:" + Str(iLineY)
End Sub
然后在Text的MouseMove事件中加入以下代码:
If Button = 1 Then
GetCurPos Text1
End If
你会发现无论是象那个方向拖动,都是 1<=l1<=l2 的,如果选择文本是从下向上的。l、l1
会变化,如果是从上到下,则只有l2变化。
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
鼠标拖放选择文本时的插入符位置方面不同。