int posX = e.X - ((PictureBox)sender).Left - this.Left; int posY = e.Y - ((PictureBox)sender).Top - this.Top - (this.Height - this.ClientRectangle.Height); int row = 0; string itemName = (string)e.Data.GetData(DataFormats.Text); if (posY > list.Count * 24) { list.Add(new List<string>()); row = list.Count - 1; } else { row = Convert.ToInt32((posY - 1) / 24); }什么意思
时间: 2023-05-22 21:00:38 浏览: 158
这是一段 C# 代码,用于处理拖放操作中鼠标位置和列表行数的计算。其中,posX 和 posY 分别表示鼠标相对于 PictureBox 控件的位置,row 表示拖放的项应该插入到哪一行,itemName 表示拖放的项的名称,list 是一个二维字符串列表,用于存储拖放的项。如果拖放的位置超出了列表的范围,则会添加一个新的空行。
相关问题
int posX = e.X - ((PictureBox)sender).Left - this.Left; int posY = e.Y - ((PictureBox)sender).Top - this.Top - (this.Height - this.ClientRectangle.Height);什么意思
这段代码是用来计算鼠标在 PictureBox 控件内的相对位置的。其中,e.X 和 e.Y 分别表示鼠标的横坐标和纵坐标,((PictureBox)sender).Left 和 ((PictureBox)sender).Top 分别表示 PictureBox 控件的左上角相对于窗体左上角的横坐标和纵坐标,this.Left 和 this.Top 分别表示窗体左上角相对于屏幕左上角的横坐标和纵坐标,this.Height 和 this.ClientRectangle.Height 分别表示窗体的总高度和客户区域的高度。通过这些值的计算,可以得到鼠标在 PictureBox 控件内的相对位置。
private void listView1_ItemDrag(object sender, ItemDragEventArgs e) { ListViewItem item = (ListViewItem)e.Item; string itemName = item.Text; listView1.DoDragDrop(itemName, DragDropEffects.Copy); private void PictureBox1_DragDrop(object sender, DragEventArgs e) { int posX = e.X - ((PictureBox)sender).Left - this.Left; int posY = e.Y - ((PictureBox)sender).Top - this.Top - (this.Height - this.ClientRectangle.Height); int row = 0; string itemName = (string)e.Data.GetData(DataFormats.Text); // 根据坐标计算出是否需要加行 if (posY > list.Count * 24) { list.Add(new List<string>()); row = list.Count - 1; } 如何实现将listview中的值比如111,拖拽到picturebox上时,可以选择放置 的位置,即鼠标按下的位置。如果picturebox上已经有了被拖拽过去的数据比如222222,实现将111可以放在222222的前面或者后面,需要计算他们这些字符串的大小,以此确定拖拽的位置限制条件是一行最多3个数据
以下是实现将listview中的值拖拽到picturebox的代码,并根据鼠标位置和已有数据的大小来计算拖拽到的位置:
private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
{
ListViewItem item = (ListViewItem)e.Item;
string itemName = item.Text;
listView1.DoDragDrop(itemName, DragDropEffects.Copy);
}
private void PictureBox1_DragDrop(object sender, DragEventArgs e)
{
int posX = e.X - ((PictureBox)sender).Left - this.Left;
int posY = e.Y - ((PictureBox)sender).Top - this.Top - (this.Height - this.ClientRectangle.Height);
// 计算拖拽到的位置所属的行和列
int row = posY / 24;
int col = posX / 50;
string itemName = (string)e.Data.GetData(DataFormats.Text);
// 根据位置限制条件计算出可以放置的位置
// 如果该位置已有数据,则根据大小比较确定应该放在前面还是后面
if (col < 3 && row < list.Count)
{
List<string> rowList = list[row];
if (rowList.Count < 3 || (col < rowList.Count && itemName.Length <= rowList[col].Length)
|| (col > 0 && itemName.Length <= rowList[col - 1].Length))
{
rowList.Insert(col, itemName);
}
else if (col < rowList.Count - 1 && itemName.Length >= rowList[col + 1].Length)
{
rowList.Insert(col + 1, itemName);
}
}
else if (posY > list.Count * 24)
{
list.Add(new List<string>() { itemName });
}
// 刷新显示已有数据
RefreshPictureBox();
}
private void RefreshPictureBox()
{
Bitmap bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(bitmap);
for (int i = 0; i < list.Count; i++)
{
List<string> rowList = list[i];
for (int j = 0; j < rowList.Count; j++)
{
string itemName = rowList[j];
g.DrawString(itemName, Font, Brushes.Black, new Point(j * 50, i * 24));
}
}
pictureBox1.Image = bitmap;
}
阅读全文