listview怎么获得当前鼠标所在的列

ah_2016 2011-01-10 01:28:13
BAIDU上找不到答案。。
如题:比如我点击listview就判断,我点击的是他的哪一行的那一列??
...全文
305 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这个,from_load改一下:
Private Sub Form_Load()
Dim i As Byte
ListView1.Arrange = lvwAutoLeft
ListView1.LabelWrap = False
ListView1.FlatScrollBar = False
ListView1.Sorted = True
ListView1.ListItems.Clear
ListView1.ColumnHeaders.Clear
ListView1.View = lvwReport
ListView1.AllowColumnReorder = True
ListView1.FullRowSelect = True
ListView1.GridLines = True
For i = 0 To 6
ListView1.ColumnHeaders.Add , , "列" & i
Next
For i = 0 To 6
Set sIitem = ListView1.ListItems.Add '显示出来
sIitem.Text = Left("0000000", 8 - Len(Str(i))) & i
sIitem.SubItems(1) = "型号"
sIitem.SubItems(2) = "名称"
sIitem.SubItems(3) = "技术资料"
sIitem.SubItems(4) = "生产许可证"
sIitem.SubItems(5) = "计量许可证"
sIitem.SubItems(6) = "制造商"
Next
End Sub
  • 打赏
  • 举报
回复
网上找的,非我原创。

新建一个工程,添加listview,命名为listview1。

Private Type POINTAPI
X As Long
Y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type LVHITTESTINFO
pt As POINTAPI
flags As Long
iItem As Long
iSubItem As Long
End Type
Private Const LVI_NOITEM = -1

Private Const LVM_FIRST = &H1000
Private Const LVM_GETSUBITEMRECT = (LVM_FIRST + 56)
Private Const LVM_SUBITEMHITTEST = (LVM_FIRST + 57)

Private Const LVIR_ICON = 1
Private Const LVIR_LABEL = 2

Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
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 listview1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim iNdexs As Long
Dim xMove As Long
Dim yMove As Long
Dim rc As RECT
If Not ListView1.HitTest(X, Y) Is Nothing Then
Dim lvhti As LVHITTESTINFO
GetCursorPos lvhti.pt '转换到ListView中的位置
ScreenToClient ListView1.hwnd, lvhti.pt
If (ListView_SubItemHitTest(ListView1.hwnd, lvhti) <> LVI_NOITEM) Then '项目
Me.Caption = "当前位置第" & ListView1.HitTest(X, Y).Index & "行,第" & lvhti.iSubItem & "列"
End If
End If
End Sub


Private Sub Form_Load()
Dim i As Byte
ListView1.Arrange = lvwAutoLeft
ListView1.LabelWrap = False
ListView1.FlatScrollBar = False
ListView1.Sorted = True
ListView1.ListItems.Clear
ListView1.ColumnHeaders.Clear
ListView1.View = lvwReport
ListView1.AllowColumnReorder = True
ListView1.FullRowSelect = True
ListView1.GridLines = True
For i = 0 To 6
ListView1.ColumnHeaders.Add , , "列" & i
Next
For i = 0 To 6
Set sIitem = ListView1.ListItems.Add '显示出来
sIitem.Text = Left("0000000", 8 - Len(Str(n))) & n
sIitem.SubItems(1) = "型号"
sIitem.SubItems(2) = "名称"
sIitem.SubItems(3) = "技术资料"
sIitem.SubItems(4) = "生成许可证"
sIitem.SubItems(5) = "计量许可证"
sIitem.SubItems(6) = "制造商"
Next
End Sub

Private Function ListView_GetSubItemRect(hwnd As Long, iItem As Long, iSubItem As Long, _
code As Long, prc As RECT) As Boolean
prc.Top = iSubItem
SelectSubItem = iSubItem
prc.Left = code
ListView_GetSubItemRect = SendMessage(hwnd, LVM_GETSUBITEMRECT, ByVal iItem, prc)
End Function

Private Function ListView_SubItemHitTest(hwnd As Long, plvhti As LVHITTESTINFO) As Long
ListView_SubItemHitTest = SendMessage(hwnd, LVM_SUBITEMHITTEST, 0, plvhti)
End Function


dbcontrols 2011-01-10
  • 打赏
  • 举报
回复
折腾了个代码,请指教
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
Const LVM_FIRST = &H1000
Const LVM_GETCOLUMNWIDTH = LVM_FIRST + 29
Private Sub ListView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim RRow As Integer, CCol As Integer
RRow = ListView1.HitTest(x, y).Index
Dim a()
ReDim a(ListView1.ColumnHeaders.Count)
For i = 0 To ListView1.ColumnHeaders.Count - 1
a(i) = 15 * i * SendMessage(ListView1.hwnd, LVM_GETCOLUMNWIDTH, i, 0)
Next i
a(ListView1.ColumnHeaders.Count) = ListView1.Width
For i = 1 To ListView1.ColumnHeaders.Count
If x <= a(i) And x > a(i - 1) Then
CCol = i
Exit For
End If
Next i
Me.Caption = RRow & " " & CCol
End Sub
soarsoar77 2011-01-10
  • 打赏
  • 举报
回复
listview.SelectedItem.Index,这个就是选择的行数
dbcontrols 2011-01-10
  • 打赏
  • 举报
回复
哪一行好判断,哪一列可能麻烦点

[Quote=引用 3 楼 ah_2016 的回复:]
具体点有谁知道吗?
[/Quote]
ah_2016 2011-01-10
  • 打赏
  • 举报
回复
具体点有谁知道吗?
dafu2003 2011-01-10
  • 打赏
  • 举报
回复
.hittest(x,y)
  • 打赏
  • 举报
回复
换grid

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧