Когда вы реализуете перетаскивание в древовидном элементе управления, вам необходимо поддерживать некоторые функции автоматической прокрутки. Например, когда вы перетаскиваете элемент из видимого узла дерева, а узел дерева назначения находится вне текущего представления дерева, элемент управления должен автоматически прокручиваться вверх или вниз в зависимости от направления мыши.
Элемент управления Windows Forms Treeview не включает встроенные функции для достижения этой цели. Однако реализовать это самостоятельно довольно просто.
Шаг 1: Получите работающий код перетаскивания в виде дерева
Убедитесь, что код перетаскивания в виде дерева работает правильно, без автопрокрутки. См. Разделы в этой папке для получения дополнительной информации о том, как реализовать перетаскивание в виде дерева.
Шаг 2: Добавить определение для функции SendMessage
Чтобы заставить древовидную структуру прокручиваться вверх или вниз, необходимо вызвать функцию Windows API SendMessage (). Для этого добавьте следующий код в начало вашего класса:
// Make sure you have the correct using clause to see DllImport:
// using System.Runtime.InteropServices;
[DllImport("user32.dll")]
private static extern int SendMessage (IntPtr hWnd, int wMsg, int wParam,
int lParam);
Шаг 3: подключиться к событию DragScroll
В событии DragScroll определите, где находится курсор мыши по отношению к верхней и нижней части элемента управления древовидной структуры. Затем вызовите SendMessage для прокрутки в качестве соответствующего.
// Implement an "autoscroll" routine for drag
// and drop. If the drag cursor moves to the bottom
// or top of the treeview, call the Windows API
// SendMessage function to scroll up or down automatically.
private void DragScroll (
object sender,
DragEventArgs e)
{
// Set a constant to define the autoscroll region
const Single scrollRegion = 20;
// See where the cursor is
Point pt = TreeView1.PointToClient(Cursor.Position);
// See if we need to scroll up or down
if ((pt.Y + scrollRegion) > TreeView1.Height)
{
// Call the API to scroll down
SendMessage(TreeView1.Handle, (int)277, (int)1, 0);
}
else if (pt.Y < (TreeView1.Top + scrollRegion))
{
// Call thje API to scroll up
SendMessage(TreeView1.Handle, (int)277, (int)0, 0);
}
Взято с здесь .