Зачем делать это так сложно, просто используйте следующее для привязки события к элементу:
element.onmousemove = function (e) {// Некоторое здесь код ... alert («Мышь перемещена!»); };
Теперь, когда вы хотите удалить событие, просто выполните это:
element.onmousemove = null;
Done!
Надеюсь, это поможет вам, ребята!
Когда вы выполняете перетаскивание в элементе управления treeview, вам необходимо поддерживать некоторые функции автоматического прокрутки. Например, когда вы перетаскиваете элемент из видимого узла дерева, а узел дерева назначения находится за пределами текущего представления дерева, элемент управления должен автоматически прокручивать вверх или вниз в зависимости от направления мыши.
Элемент управления 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);
}
Взято из здесь .
Совсем так же, как и выше, но без этой «верхней» ошибки и немного проще использовать в больших проектах.
Добавьте этот класс в свой проект:
public static class NativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
public static void Scroll(this Control control)
{
var pt = control.PointToClient(Cursor.Position);
if ((pt.Y + 20) > control.Height)
{
// scroll down
SendMessage(control.Handle, 277, (IntPtr) 1, (IntPtr) 0);
}
else if (pt.Y < 20)
{
// scroll up
SendMessage(control.Handle, 277, (IntPtr) 0, (IntPtr) 0);
}
}
}
Затем просто подпишитесь на событие DragOver вашего древовидного изображения (или любой другой элемент управления / пользовательский элемент управления, который вы хотите включить прокрутку во время перетаскивания) и вызовите метод Scroll ().
private void treeView_DragOver(object sender, DragEventArgs e)
{
treeView.Scroll();
}
(TreeView1.Top + scrollRegion)
на(scrollRegion)
. По-моему, вам не нужна максимальная ценность. Сначала я попытался добавить TreeView1.Top (древовидная структура находится в нижней части моей формы) и startet процесса прокрутки в середине дерева. Поэтому я удалил TreeView1.Top и прокрутку startet в верхней части моего дерева. – daniel 15 February 2012 в 11:58