急!如何获取listview控件中鼠标指向项目的索引?
以前在listbox控件中可以声明
Public 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 Const LB_ITEMFROMPOINT = &H1A9
然后在list控件的mousemove事件里面加入如下代码:
On Error GoTo err
If List1.listcount= 0 Then Exit Sub
Dim poss As Long, Indx As Long
poss = x / Screen.TwipsPerPixelX + y / Screen.TwipsPerPixelY * 65536
Indx = SendMessage(List1.hwnd, LB_ITEMFROMPOINT, 0, ByVal poss)
err: Exit Sub
其中Indx即是鼠标移动过程中指向的list项目的索引了。但是在listview控件中这套方法完全行不通,那么我又该如何在listview中实现类似功能呢?
其实我是想实现在listview中通过鼠标拖动项目功能(就像那些媒体播放器里面的列表一样),这就要知道当前鼠标指向项目的索引才行。以前在listbox中我已经很好地解决了这个问题,但换了控件却发现如此不同,自己百思不得其解,故来到高手云集的CSDN上请教,还忘大家一施援手了!谢谢
问题点数:60、回复次数:5Top
1 楼tztz520(午夜逛街)回复于 2006-03-17 13:42:47 得分 25
Private Sub ListView1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim tempItem As ListItem
Set tempItem = ListView1.HitTest(X, Y)
If Not tempItem Is Nothing Then
Debug.Print tempItem.Index
End If
end subTop
2 楼tztz520(午夜逛街)回复于 2006-03-17 13:43:28 得分 0
就是HitTest方法就可以了Top
3 楼laviewpbt(人一定要靠自己)回复于 2006-03-17 15:47:18 得分 20
楼上是一种方法
如果想得到列,可以用
Private Sub ListView1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim a As Single, Column As Long, i As Long, row As String
a = X - ListView1.SelectedItem.Left
For i = 1 To ListView1.ColumnHeaders.Count
If (ListView1.ColumnHeaders(i).Left <= a) And (a <= ListView1.ColumnHeaders(i).Left + ListView1.ColumnHeaders(i).Width) Then
Column = i
Exit For
End If
Next i
Label1.Caption = "Êó±êËùÔÚÁÐ:" & Column
End Sub
Top
4 楼vansoft(Vansoft Workroom)回复于 2006-03-17 20:03:34 得分 15
以下代码是从我的实际工程中COPY出来的。
lvwContent是控件名。
常量和API申明,你自己用Google找一下。
Private Sub lvwContent_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim lvhti As LVHITTESTINFO
Dim i As Long, l As Long
Dim s As String
Dim TempS As String
Call GetCursorPos(lvhti.pt)
Call ScreenToClient(lvwContent.hwnd, lvhti.pt)
Call SendMessage(lvwContent.hwnd, LVM_SUBITEMHITTEST, 0, lvhti.pt)
If m_X <> lvhti.iItem Or m_Y <> lvhti.iSubItem Then
m_X = lvhti.iItem
m_Y = lvhti.iSubItem
If m_X < 0 Then
'没有
Else
If m_Y = 0 Then
'某行第一列
debug.print lvwContent.ListItems(m_X + 1).Text
Else
'某行第某列
debug.print lvwContent.ListItems(m_X + 1).ListSubItems(m_Y).Text
End If
End If
End If
End Sub
Top
5 楼prolq()回复于 2006-03-17 22:51:11 得分 0
哇!感谢各位详细的解答,没想到这么快就得到了解决,CSDN真是个答疑与提高的好地方啊!好了,再次感谢大家!Top




