C# 拖动多个选定控件
我在WinFormsC# 拖动多个选定控件,c#,.net,user-controls,runtime,C#,.net,User Controls,Runtime,我在WinForms窗体上有一个UserControl,可以动态创建多个实例。如果我选择它,我可以拖动它。现在,如果我选择多个用户控件(使用ctrl+按钮单击),我希望能够同时拖动所有这些控件 我可以像对一个用户控件那样做吗 到目前为止,我一直在尝试: // For dragging I use this method and also I have // overridden MouseUp,MouseDown,MouseMove from .net public void StartDra
窗体上有一个UserControl
,可以动态创建多个实例。如果我选择它,我可以拖动它。现在,如果我选择多个用户控件(使用ctrl+按钮单击),我希望能够同时拖动所有这些控件
我可以像对一个用户控件那样做吗
到目前为止,我一直在尝试:
// For dragging I use this method and also I have
// overridden MouseUp,MouseDown,MouseMove from .net
public void StartDrag()
{
dragging = true;
Point p = PointToClient(Cursor.Position);
dragStart = new Point(Math.Max(0, p.X), Math.Max(0, p.Y));
buttondrag.Capture = true;
}
private void Usercontrol1_SelectedChanged(object sender, EventArgs e)
{
if (((UserControl)sender).Selected)
{
if (SelectedUserControl.Count > 1)
{
foreach (UserControl c in panel1.Controls)
{
c.StartDrag();
}
}
}
}
如果要在按下ctrl+键时激活程序,则需要查看键挂钩,然后在“键关闭”事件中设置一些代码,告知程序选择所有项目。
这是非常先进的,很难做到,如果你的新钥匙钩,但这里有一个链接的钥匙钩。
祝你好运
如果希望在按下ctrl+键时激活程序,则需要查看键挂钩,然后在“键关闭”事件中设置一些代码,告知程序选择所有项目。
这是非常先进的,很难做到,如果你的新钥匙钩,但这里有一个链接的钥匙钩。
祝你好运
//将控件放在面板中,然后使用此类
class ControlMover
{
public enum Direction
{
Any,
Horizontal,
Vertical
}
public static void Init(Control control)
{
Init(control, Direction.Any);
}
public static void Init(Control control, Direction direction)
{
Init(control, control, direction);
}
public static void Init(Control control, Control container, Direction direction)
{
bool Dragging = false;
Point DragStart = Point.Empty;
control.MouseDown += delegate(object sender, MouseEventArgs e)
{
Dragging = true;
DragStart = new Point(e.X, e.Y);
control.Capture = true;
};
control.MouseUp += delegate(object sender, MouseEventArgs e)
{
Dragging = false;
control.Capture = false;
};
control.MouseMove += delegate(object sender, MouseEventArgs e)
{
if (Dragging)
{
if (direction != Direction.Vertical)
container.Left = Math.Max(0, e.X + container.Left - DragStart.X);
if (direction != Direction.Horizontal)
container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y);
}
};
}
}
public Form1()
{
InitializeComponent();
ControlMover.Init(this.panel1);
ControlMover.Init(this.panel1, ControlMover.Direction.Vertical);
}
//将控件放在面板中,并使用此类
class ControlMover
{
public enum Direction
{
Any,
Horizontal,
Vertical
}
public static void Init(Control control)
{
Init(control, Direction.Any);
}
public static void Init(Control control, Direction direction)
{
Init(control, control, direction);
}
public static void Init(Control control, Control container, Direction direction)
{
bool Dragging = false;
Point DragStart = Point.Empty;
control.MouseDown += delegate(object sender, MouseEventArgs e)
{
Dragging = true;
DragStart = new Point(e.X, e.Y);
control.Capture = true;
};
control.MouseUp += delegate(object sender, MouseEventArgs e)
{
Dragging = false;
control.Capture = false;
};
control.MouseMove += delegate(object sender, MouseEventArgs e)
{
if (Dragging)
{
if (direction != Direction.Vertical)
container.Left = Math.Max(0, e.X + container.Left - DragStart.X);
if (direction != Direction.Horizontal)
container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y);
}
};
}
}
public Form1()
{
InitializeComponent();
ControlMover.Init(this.panel1);
ControlMover.Init(this.panel1, ControlMover.Direction.Vertical);
}
谢谢,但这仅适用于一个usercontrol,而不适用于动态usercontrol。您可以将其用于多个选定控件,仅适用于每个控件使用此类并为鼠标事件设置代码以选择表单中的所有控件。谢谢,但这仅适用于一个usercontrol,不适用于Dynamics usercontrols。您可以将其用于多个选定控件,只适用于每个控件使用此类并为鼠标事件设置代码以选择窗体中的所有控件。