从listview上拖拽数据到picturebox上时,可以选择拖拽到的位置是鼠标的位置,计算拖拽进去数据的大小来实现拖拽位置是鼠标位置,该如何实现
时间: 2024-05-14 07:14:34 浏览: 163
C#控件Picturebox实现鼠标拖拽功能
实现这一功能可以通过以下步骤:
1. 在listview的MouseDown事件中记录下鼠标点击的位置。
2. 在listview的MouseMove事件中判断鼠标是否按下,并且移动距离超过一定阈值,如果是则开始拖拽操作。
3. 在拖拽操作中,在拖拽源控件的DragEnter事件中设置拖拽效果为Copy,同时记录下拖拽数据的大小。
4. 在拖拽目标控件的DragOver事件中设置拖拽效果为Copy,同时计算拖拽数据在目标控件中的位置,即通过鼠标点击位置和拖拽数据大小计算出左上角坐标。
5. 在拖拽目标控件的DragDrop事件中处理拖拽数据,将其显示在计算出的位置上。
以下是示例代码:
```csharp
private Point startPoint;
private Size dragSize = SystemInformation.DragSize;
private void listview1_MouseDown(object sender, MouseEventArgs e)
{
startPoint = new Point(e.X, e.Y);
}
private void listview1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left &&
Math.Abs(e.X - startPoint.X) >= dragSize.Width &&
Math.Abs(e.Y - startPoint.Y) >= dragSize.Height)
{
var item = listview1.SelectedItems[0];
var data = new DataObject(item);
listview1.DoDragDrop(data, DragDropEffects.Copy);
}
}
private void picturebox1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
var item = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
var size = item.Bounds.Size;
e.Data.SetData(size);
}
private void picturebox1_DragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
var size = (Size)e.Data.GetData(typeof(Size));
var point = picturebox1.PointToClient(new Point(e.X, e.Y));
var x = point.X - size.Width / 2;
var y = point.Y - size.Height / 2;
var location = new Point(x, y);
picturebox1.Location = location;
}
private void picturebox1_DragDrop(object sender, DragEventArgs e)
{
var item = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
var image = (Image)item.Tag;
picturebox1.Image = image;
}
```
阅读全文