C#实现拖拽添加按钮到指定面板,并实现按钮在面板中拖动
1、添加TreeView控件,添加节点,设置AllowDrop属性为true。
效果图
代码
public partial class MainForm : Form
{
/// <summary>
/// 鼠标点
/// </summary>
Point mousePoint;
/// <summary>
/// 按钮点
/// </summary>
Point btnPoint;
public MainForm()
{
InitializeComponent();
}
/// <summary>
/// 树状图控件:拖拽节点时触发
/// </summary>
private void treeView_ToolTree_ItemDrag(object sender, ItemDragEventArgs e)
{
IDataObject data = new DataObject();
data.SetData("tool", e.Item);
this.DoDragDrop(data, DragDropEffects.Copy);
}
/// <summary>
/// 拖进面板时触发
/// </summary>
private void panel_FlowPanel_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent("tool"))
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
/// <summary>
/// 拖放操作完成时触发
/// </summary>
private void panel_FlowPanel_DragDrop(object sender, DragEventArgs e)
{
object item = e.Data.GetData("tool");
if (item != null)
{
TreeNode node = item as TreeNode;
Button button = new Button();
button.Name = node.Text;
button.Text = button.Name;
button.MouseMove += Button_MouseMove;
button.MouseDown += Button_MouseDown;
button.Location = panel_FlowPanel.PointToClient(Control.MousePosition);
panel_FlowPanel.Controls.Add(button);
}
}
/// <summary>
/// 鼠标左键按下,记录点位
/// </summary>
private void Button_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Button btn = sender as Button;
btnPoint = btn.Location;
mousePoint = MousePosition;
}
}
/// <summary>
/// 鼠标左键按下按钮移动:更新位置,大小
/// </summary>
private void Button_MouseMove(object sender, MouseEventArgs e)
{
Button btn = sender as Button;
if (e.Button == MouseButtons.Left)
{
//当前按钮位置 = X = 当前鼠标点.X - 按下时的鼠标点.X + 按钮点.X
//当前按钮位置 = Y = 当前鼠标点.Y - 按下时的鼠标点.Y + 按钮点.Y
btn.Location = new Point(MousePosition.X - mousePoint.X + btnPoint.X, MousePosition.Y - mousePoint.Y + btnPoint.Y);
panel_FlowPanel.Refresh();
}
}
}