List1_DragDrop(Source As Control, X As Single, Y As Single) 中
如何由X,Y得到拖放到listbox 的那个 list.ListIndex,要用API吗?
...全文
9411打赏收藏
Listbox 拖放的问题!解决就给100分!
listbox中有多个item, 一个对像拖放到一个listbox, 在listbox 的事件 List1_DragDrop(Source As Control, X As Single, Y As Single) 中 如何由X,Y得到拖放到listbox 的那个 list.ListIndex,要用API吗?
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 Const LB_ITEMFROMPOINT = &H1A9
Private Sub Form_Load()
Dim i As Long
For i = 1 To 100
List1.AddItem i
Next
Text1.Text = "aaaa"'dragmode=1
Text2 = "bbbb"'dragmode=1
Text3 = "cccc"'dragmode=1
End Sub
Private Sub List1_DragDrop(Source As Control, X As Single, Y As Single)
Dim lXPoint As Long, lYPoint As Long, lIndex As Long
lXPoint = CLng(X / Screen.TwipsPerPixelX)
lYPoint = CLng(Y / Screen.TwipsPerPixelY)
If TypeOf Source Is TextBox Then lIndex = SendMessage(List1.hwnd, LB_ITEMFROMPOINT, 0, _
ByVal ((lYPoint * 65536) + lXPoint)) ' 获得当前的光标所在的的屏幕位置
List1.AddItem Source.Text, lIndex
End Sub
Dim lXPoint As Long
Dim lYPoint As Long
Dim lIndex As Long
lXPoint = CLng(X / Screen.TwipsPerPixelX)
lYPoint = CLng(Y / Screen.TwipsPerPixelY)
lIndex = SendMessage(List1.hwnd, LB_ITEMFROMPOINT, 0, _
ByVal ((lYPoint * 65536) + lXPoint))
MsgBox List1.List(lIndex)
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 Const LB_ITEMFROMPOINT = &H1A9
Dim lXPoint As Long
Dim lYPoint As Long
Dim lIndex As Long
LINDEX = SendMessage(List1.hwnd, LB_ITEMFROMPOINT, 0, _
ByVal ((lYPoint * 65536) + lXPoint))
MsgBox List1.List(LINDEX)
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 Const LB_ITEMFROMPOINT = &H1A9
Dim LINDEX As Long
LINDEX = SendMessage(List1.hwnd, LB_ITEMFROMPOINT, 0, _
ByVal ((lYPoint * 65536) + lXPoint))
MsgBox List1.List(LINDEX)
这个我刚刚做过。
可以对list进行划分,计算得到一个数组。数组的每一个项对应于list的每一项。这样可以自己编一个函数来测试鼠标所在点是否在你想要的区域里,这样,就可以得到数组的index,进而知道list的当前index,使用index+list.topindex则可以得到相应的list.listindex
自定义类型:
type Point
x as single
y as single
end type
type Rect
point1 as Point
point2 as point
end type
dim m_Rects(dimension) as Rect'dimension为和list中可视的项目数相等。