!!!!!!一筹莫展!!!!!!:关于Listview和Treeview的Drag问题

come2000 2001-10-19 03:29:07
加精
!!!!!!一筹莫展!!!!!!:关于Listview和Treeview的Drag问题
  为了象Outlook Express那样将信件移到文件夹中,我用了一个Treeview和Listview。然而当我将Listview中的Item拖向Treeview中时,我才发现此时Treeview根本就不响应Treeview_MouseMove事件,更不用说Treeview_DragDrop和Treeview_DragOver这两个事件了。一筹莫展!!!!!!!
Please Help me!!!!
come2000@163.com
2001.10.19
...全文
224 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhchg 2002-02-02
  • 打赏
  • 举报
回复
m
come2000 2001-10-19
  • 打赏
  • 举报
回复
吴文智(Clevertiger,heartfultiger...),你好,谢谢你的代码。为了实现这个drag,我找了一天,没想到你的代码这么简单就实现了。还以为非得用api不可呢。thinkssssss!!!!!
come2000@163.com
come2000 2001-10-19
  • 打赏
  • 举报
回复
只能在Microsoft Windows Common Controls 6.0下才能实现,而且不能一次移动多个Item。如果在5.0下怎么实现啊?程序里面的MSComctlLib是什么东西啊,我在MSDN里都查不到?唉,api
gwolf 2001-10-19
  • 打赏
  • 举报
回复
我正找这问题呢。UP
playyuer 2001-10-19
  • 打赏
  • 举报
回复
这里还有一个微软官方的文章:
HOWTO: Scroll the TreeView When Dragging and Dropping a Node
http://support.microsoft.com/support/kb/articles/Q177/7/43.asp

foolishtiger 2001-10-19
  • 打赏
  • 举报
回复
要试用本例请在窗体上加一个TreeView名为TreeView1,和一个ListView名为ListView1
然后将下列代码粘贴到窗体中

Private Sub Form_Load()
TreeView1.Nodes.Add , , , "目录一"
TreeView1.Nodes.Add , , , "目录二"
TreeView1.Nodes.Add , , , "目录三"

ListView1.ColumnHeaders.Add , , "文件名"
ListView1.ListItems.Add , , "文件一"
ListView1.ListItems.Add , , "文件二"
ListView1.ListItems.Add , , "文件三"

'以下属性的设置是为了突出演示的效果
TreeView1.HideSelection = False
ListView1.View = lvwReport
ListView1.LabelEdit = lvwManual
ListView1.DragMode = vbManual
'这里随便取了个可能在每个人的机器上都有的图标,目的是为了大家试用时的方便
'大家可以自己换合适的图标
ListView1.DragIcon = LoadPicture("c:\windows\winupd.ico")
End Sub


Private Sub ListView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = vbLeftButton Then
ListView1.Drag
End If
End Sub


Private Sub TreeView1_DragDrop(Source As Control, x As Single, y As Single)
MsgBox "你把文件拖到了 " & TreeView1.DropHighlight.Text, vbInformation
End Sub

Private Sub TreeView1_DragOver(Source As Control, x As Single, y As Single, State As Integer)
Set TreeView1.DropHighlight = TreeView1.HitTest(x, y)
End Sub

关键是 Set TreeView1.DropHighlight = TreeView1.HitTest(x, y) 这句话
playyuer 2001-10-19
  • 打赏
  • 举报
回复
参阅:
playyuer(女㊣爱),你是斑竹,问你个简单的问题
如何将listview中显示出来的记录拖到treeview中去!??我急用!!
http://www.csdn.net/expert/topic/200/200901.shtm

'下面是一个更完整的例子
'实现
'1.从 Listview 拖拽 Item 加到 Treeview 的 Node
'2.添加 Treeview 节点时,越界可"自动滚动"!!!!!
'3.编辑节点的 Text
'Objects:
'Form1、Treeview1、Listview1、Timer1、Command1
Option Explicit
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 WM_VSCROLL = &H115
Private Const WM_HSCROLL = &H114
Dim bIsLvwItemDblClick As Boolean
Dim bIsTvwNodeDblClick As Boolean
Dim mfX As Single
Dim mfY As Single
Private Enum ScrollDirection
VScrollBarUp = 0
HScrollBarRight = 1
VScrollBarDown = 2
HScrollBarLeft = 3
End Enum
Dim sdX As ScrollDirection
Private Sub Command1_Click()
Dim Nodex As MSComctlLib.Node
If TreeView1.SelectedItem Is Nothing Then
Set Nodex = TreeView1.Nodes.Add(, , GetNextKey(), "")
Else
Set Nodex = TreeView1.Nodes.Add(TreeView1.SelectedItem, tvwChild, GetNextKey() & ListView1.SelectedItem.Text, ListView1.SelectedItem.Text)

End If
Nodex.Selected = True
'TreeView1.SelectedItem.Expanded = True

TreeView1.StartLabelEdit


End Sub



Private Sub Form_DragOver(Source As Control, x As Single, y As Single, State As Integer)
If Source Is TreeView1 Then
Timer1.Enabled = False
End If
End Sub
Private Sub Form_Load()
Dim i As Integer
Timer1.Enabled = False
Timer1.Interval = 200
TreeView1.Style = tvwTreelinesPlusMinusPictureText
For i = 1 To 50
TreeView1.Nodes.Add , , GetNextKey, "Node " & i
Next i
TreeView1.HideSelection = False

TreeView1.LabelEdit = tvwManual

ListView1.ListItems.Add , , "cc"
ListView1.ListItems.Add , , "dd"

ListView1.OLEDragMode = ccOLEDragAutomatic
ListView1.LabelEdit = lvwManual
ListView1.HideSelection = False
End Sub
Private Sub ListView1_DblClick()
If bIsLvwItemDblClick Then
MsgBox ListView1.SelectedItem.Text
End If
End Sub
Private Sub ListView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = vbLeftButton Then
ListView1.DragIcon = ListView1.SelectedItem.CreateDragImage
ListView1.Drag vbBeginDrag
Else
If ListView1.HitTest(x, y) Is ListView1.SelectedItem Then
bIsLvwItemDblClick = True
Else
bIsLvwItemDblClick = False
End If
End If
End Sub

Private Sub TreeView1_AfterLabelEdit(Cancel As Integer, NewString As String)
If VBA.Len(NewString) <= 0 Then
MsgBox "error"
TreeView1.StartLabelEdit
Cancel = 1

End If
End Sub

Private Sub TreeView1_DblClick()
If bIsTvwNodeDblClick Then
MsgBox TreeView1.SelectedItem.Text
End If
End Sub
Private Sub TreeView1_DragDrop(Source As Control, x As Single, y As Single)
If Not TreeView1.DropHighlight Is Nothing Then
Dim Nodex As MSComctlLib.Node
Set Nodex = TreeView1.Nodes.Add(TreeView1.DropHighlight.Key, tvwChild, GetNextKey() & ListView1.SelectedItem.Text, ListView1.SelectedItem.Text)
TreeView1.DropHighlight.Expanded = True
Nodex.Selected = True
TreeView1.StartLabelEdit
End If
Timer1.Enabled = False
End Sub
Private Sub TreeView1_DragOver(Source As Control, x As Single, y As Single, State As Integer)
Set TreeView1.DropHighlight = TreeView1.HitTest(x, y)
mfX = x
mfY = y
If y > 0 And y < 100 Then
sdX = VScrollBarUp
Timer1.Enabled = True
ElseIf y > (TreeView1.Height - 400) And y < TreeView1.Height Then
sdX = VScrollBarDown
Timer1.Enabled = True
ElseIf x > 0 And x < 100 Then
sdX = HScrollBarLeft
Timer1.Enabled = True
ElseIf x > (TreeView1.Width - 400) And x < TreeView1.Width Then
sdX = HScrollBarRight
Timer1.Enabled = True
Else
Timer1.Enabled = False
End If
End Sub
Private Sub TreeView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
If TreeView1.HitTest(x, y) Is TreeView1.SelectedItem Then
bIsTvwNodeDblClick = True
Else
bIsTvwNodeDblClick = False
End If
End Sub
Private Sub Timer1_Timer()
Set TreeView1.DropHighlight = TreeView1.HitTest(mfX, mfY)
Select Case sdX
Case VScrollBarUp
SendMessage TreeView1.hwnd, WM_VSCROLL, 0, vbNull
Case VScrollBarDown
SendMessage TreeView1.hwnd, WM_VSCROLL, 1, vbNull
Case HScrollBarLeft
SendMessage TreeView1.hwnd, WM_HSCROLL, 0, vbNull
Case HScrollBarRight
SendMessage TreeView1.hwnd, WM_HSCROLL, 1, vbNull
End Select
End Sub
Private Sub TreeView1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
Timer1.Enabled = False
End Sub
Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
TreeView1.DropHighlight = TreeView1.HitTest(x, y)
If Not TreeView1.DropHighlight Is Nothing Then
TreeView1.SelectedItem = TreeView1.HitTest(x, y)
End If
Set TreeView1.DropHighlight = Nothing
End Sub
Private Function GetNextKey() As String
Dim sNewKey As String
Dim iHold As Integer
Dim i As Integer
On Error GoTo myerr
iHold = Val(TreeView1.Nodes(1).Key)
For i = 1 To TreeView1.Nodes.Count
If Val(TreeView1.Nodes(i).Key) > iHold Then
iHold = Val(TreeView1.Nodes(i).Key)
End If
Next
iHold = iHold + 1
sNewKey = VBA.CStr(iHold) & "_"
GetNextKey = sNewKey
Exit Function
myerr:
GetNextKey = "1_"
End Function

7,789

社区成员

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

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