实现窗体上控件自由拖动功能的步骤
- 在窗体的MouseDown事件中记录鼠标按下时控件的位置,并将控件的Capture属性设置为True,保证鼠标控制焦点在控件上。
- 在窗体的MouseMove事件中,判断是否鼠标已经按下并且移动过,如果是,则根据鼠标移动的偏移量调整控件的位置。
- 在窗体的MouseUp事件中,将控件的Capture属性设置为False,释放鼠标的控制焦点。
示例1:实现标签控件在窗体上自由拖动
private Point _mouseOffset; // 鼠标拖动时控件相对窗体的偏移量
private void label1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_mouseOffset = new Point(-e.X, -e.Y); // 记录鼠标按下时控件左上角和鼠标位置之间的偏移量
label1.Capture = true; // 设置控件为鼠标捕获状态,以保证鼠标控制焦点在控件上
}
}
private void label1_MouseMove(object sender, MouseEventArgs e)
{
if (label1.Capture)
{
Point mousePos = MousePosition;
mousePos.Offset(_mouseOffset.X, _mouseOffset.Y);
label1.Location = PointToClient(mousePos); // 将鼠标移动的偏移量应用到控件的位置上
}
}
private void label1_MouseUp(object sender, MouseEventArgs e)
{
label1.Capture = false; // 释放控件的鼠标捕获状态
}
示例2:实现窗体上所有按钮控件自由拖动
private Dictionary<Button, Point> _buttonPositions = new Dictionary<Button, Point>(); // 保存所有按钮控件的原始位置
private void Form1_Load(object sender, EventArgs e)
{
// 记录所有按钮控件的原始位置
foreach (Control control in Controls)
{
if (control is Button button)
{
_buttonPositions[button] = button.Location;
}
}
}
private void button_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Button button = (Button)sender;
_mouseOffset = new Point(-e.X, -e.Y); // 记录鼠标按下时控件左上角和鼠标位置之间的偏移量
button.Capture = true; // 设置控件为鼠标捕获状态,以保证鼠标控制焦点在控件上
}
}
private void button_MouseMove(object sender, MouseEventArgs e)
{
if (((Button)sender).Capture)
{
Point mousePos = MousePosition;
mousePos.Offset(_mouseOffset.X, _mouseOffset.Y);
((Button)sender).Location = PointToClient(mousePos); // 将鼠标移动的偏移量应用到控件的位置上
}
}
private void button_MouseUp(object sender, MouseEventArgs e)
{
((Button)sender).Capture = false; // 释放控件的鼠标捕获状态
}
private void btnReset_Click(object sender, EventArgs e)
{
// 将所有按钮控件的位置还原到原始位置
foreach (var buttonPosition in _buttonPositions)
{
buttonPosition.Key.Location = buttonPosition.Value;
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# WinForm实现窗体上控件自由拖动功能示例 - Python技术站