Microsoft KB Archive/177743

= How To Scroll the TreeView When Dragging and Dropping a Node =

Article ID: 177743

Article Last Modified on 7/13/2004

-

APPLIES TO


 * Microsoft Visual Basic 5.0 Professional Edition
 * Microsoft Visual Basic 6.0 Professional Edition
 * Microsoft Visual Basic 5.0 Enterprise Edition
 * Microsoft Visual Basic 6.0 Enterprise Edition

-



This article was previously published under Q177743



SUMMARY
The TreeView control supports drag-and-drop. When a Node is dragged to the top or bottom of the control, the control does not automatically scroll vertically. Because the control does not support scrolling when doing drag- and-drop, scrolling must be implemented by the developer. This article demonstrates one way to implement scrolling when performing drag-and-drop.



MORE INFORMATION
The following example uses API calls to scroll the TreeView when the mouse pointer gets close to the bottom or top of the control and you are doing a drag-and-drop of a Node.

Step-by-Step Example
 Create a new standard EXE project.Form1 is created by default. Click Components on the Project menu. Check "Microsoft Windows Common Controls 5.0." Add a Treeview, ImageList, and Timer to Form1. Right-click the ImageList Control and select Properties from the pop-up menu. On the General Tab of the Property Pages dialog, select 16 x 16. Click the Images Tab, and insert 2 ICO files. NOTE: Icon files can be found in the directory ..\VB\Graphics\Icon.  Add the following code to the Code Window of Form1: 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 Dim mfX As Single Dim mfY As Single Dim moNode As Node Dim m_iScrollDir As Integer 'Which way to scroll Dim mbFlag As Boolean

Private Sub Form_DragOver(Source As Control, x As Single, y As _       Single, State As Integer) If Source.Name = "TreeView1" Then Timer1.Enabled = False End If     End Sub

Private Sub Form_Load Dim i As Integer Dim n As Integer Timer1.Enabled = False Timer1.Interval = 200 TreeView1.Style = tvwTreelinesPlusMinusPictureText TreeView1.ImageList = ImageList1 'Populate TreeView controls For i = 1 To 50 TreeView1.Nodes.Add Text:="Node " & i, Image:=1, _ SelectedImage:=2 Next i        For i = 1 To 50 For n = 1 To 5 TreeView1.Nodes.Add Relative:=i, Relationship:=tvwChild, _ Text:="Child Node " & n, _ Image:=1, SelectedImage:=2 Next n        Next i      End Sub

Private Sub Timer1_Timer Set TreeView1.DropHighlight = TreeView1.HitTest(mfX, mfY) If m_iScrollDir = -1 Then 'Scroll Up        ' Send a WM_VSCROLL message 0 is up and 1 is down SendMessage TreeView1.hwnd, 277&, 0&, vbNull Else 'Scroll Down SendMessage TreeView1.hwnd, 277&, 1&, vbNull End If     End Sub

Private Sub TreeView1_DragDrop(Source As Control, x As Single, _       y As Single) ' If you were moving the Node you dragged to be the child ' of the Node you dropped it on, you would need to     ' make moNode the selected Node after you made it a child If Not TreeView1.DropHighlight Is Nothing Then MsgBox moNode.Text & " was dropped on " & _ TreeView1.DropHighlight.Text End If       Set TreeView1.DropHighlight = Nothing Set moNode = Nothing 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 'scroll up          m_iScrollDir = -1 Timer1.Enabled = True ElseIf y > (TreeView1.Height - 200) And y < TreeView1.Height Then 'scroll down m_iScrollDir = 1 Timer1.Enabled = True Else Timer1.Enabled = False End If     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)      'Make sure we are over a Node If Not TreeView1.DropHighlight Is Nothing Then TreeView1.SelectedItem = TreeView1.HitTest(x, y)         Set moNode = TreeView1.SelectedItem ' Set the item being dragged. End If      Set TreeView1.DropHighlight = Nothing End Sub

Private Sub TreeView1_MouseMove(Button As Integer, Shift As _     Integer, x As Single, y As Single) If Button = vbLeftButton Then TreeView1.DragIcon = TreeView1.SelectedItem.CreateDragImage TreeView1.Drag vbBeginDrag End If     End Sub

</li> Save and run the sample. Select a Node and then drag it to the bottom of the TreeView. You will see the TreeView scroll.</li></ol>

<div class="references_section">