int posX = e.X - ((PictureBox)sender).Left - this.Left; int posY = e.Y - ((PictureBox)sender).Top - this.Top - (this.Height - this.ClientRectangle.Height);什么意思
时间: 2023-05-22 18:00:48 浏览: 139
这段代码是用来计算鼠标在 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;
}
function moveBox(box, event) { box.style.top = event.pageY - box.posy + "px"; box.style.left = event.pageX - box.posx + "px"; }
这段代码是一个用于移动盒子的函数。它接受两个参数:`box` 表示要移动的盒子元素,`event` 表示鼠标事件对象。
这个函数通过修改盒子元素的 `top` 和 `left` 样式属性来实现移动。具体步骤如下:
1. `event.pageY` 和 `event.pageX` 分别表示鼠标事件发生时的垂直和水平页面坐标。
2. `box.posy` 和 `box.posx` 是盒子元素的初始位置(偏移量)。这些值可以通过之前的操作进行设置或者从其他地方获取。
3. 通过计算鼠标事件位置和盒子元素初始位置之间的差值,来确定盒子元素的新位置。
4. 将新位置设置为盒子元素的 `top` 和 `left` 样式属性值。
请注意,这段代码只能实现基本的盒子移动功能,具体的实现可能还需要其他的代码来处理边界检测、拖拽过程等。
如果您有任何进一步的问题,请随时提问!
阅读全文