我想做一个可以在窗体中拖动控件的程序,应该怎么做?控件名_MouseMove和控件名_DragDrop总是不尽人意

bgxy 2002-08-02 01:47:21
比如在窗体上有一个PictureBox控件,鼠标左键在控件中点击,划动鼠标可以让控件跟随鼠标一起移动,松开鼠标的点击就停止移动。
我试着写的代码是:
private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
//如果点击左键并移动
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
this.pictureBox1.Location = new System.Drawing.Point(e.X-pictureBox1.Location.X, e.Y-pictureBox1.Location.Y);
}
}
先不要考虑我的控件被移动之后的Location算法(e.X-pictureBox1.Location.X一定不对),请高手指点,谢谢!
...全文
40 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tgx 2002-11-30
  • 打赏
  • 举报
回复
由于边框的原因可能要根据不同情况进行调整

Private StartPoint As Point

Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
StartPoint = New Point(-e.X - 1, -e.Y - 1)
End Sub

Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
If e.Button = MouseButtons.Left Then
Dim NewLocation As New Point(Control.MousePosition.X - Location.X - (Me.Width - Me.ClientRectangle.Width) / 2, _
Control.MousePosition.Y - Location.Y - (Me.Height - Me.ClientRectangle.Height) + 4)
NewLocation.Offset(StartPoint.X, StartPoint.Y)
PictureBox1.Location = NewLocation
'Me.ClientRectangle.X()
End If
End Sub
bgxy 2002-08-09
  • 打赏
  • 举报
回复
最近CSDN太慢了!我早就想给分,连打开这个帖子都要花10几分钟!
bgxy 2002-08-07
  • 打赏
  • 举报
回复
谢谢提供思路!不过MousePosition不是世界坐标,是相对于屏幕的坐标。我又修改了一下,基本可以了。谢谢!

private Point StartPoint; //鼠标点击之后的相对于窗体的开始坐标
private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
StartPoint = new Point(-e.X,-e.Y);
}

private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
//如果点击左键并移动
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Point NewLoction = new Point(Control.MousePosition.X - this.Location.X ,
Control.MousePosition.Y - this.Location.Y);
NewLoction.Offset(StartPoint.X,StartPoint.Y);
this.pictureBox1.Location = NewLoction;
}
}
niwalker 2002-08-07
  • 打赏
  • 举报
回复
唉!你也真是,我的代码写错了,你也不会自己去查查:
把pictureBox1.Controls.MousePosition;
改为Control.MousePosition;
OK?
bgxy 2002-08-06
  • 打赏
  • 举报
回复
那位高手能给我贴出正确的可以执行的代码?谢谢!
bgxy 2002-08-04
  • 打赏
  • 举报
回复
可pictureBox1.Controls.MousePosition;不能编译。
pictureBox1.Controls后面加了点(.)之后,MousePosition不能出现
niwalker 2002-08-04
  • 打赏
  • 举报
回复
是笔误,不好意思,而且MouseDown的Delta要改成delta, 笔误 too. :)
你的代码方法不对
bgxy 2002-08-04
  • 打赏
  • 举报
回复
感谢解答!
Point pos=pictureBox1.Counts.MousePosition;是
pictureBox1.Controls.MousePosition;的笔误吗?编译没有通过。
而且MousePosition是相对于屏幕的坐标,我试着改成了以下代码,可是移动的时候,控件总是离得很远。请高手赐教!

private Point StartPoint; //鼠标点击之后的相对于窗体的开始坐标
private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
StartPoint = new Point(e.X + pictureBox1.Location.X ,e.Y + pictureBox1.Location.Y);
}

private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
//如果点击左键并移动
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
//鼠标移动之后的相对于窗体的坐标
Point EndPoint = new Point(e.X + pictureBox1.Location.X ,e.Y + pictureBox1.Location.Y);
EndPoint.Offset(EndPoint.X - StartPoint.X,EndPoint.Y - StartPoint.Y);
this.pictureBox1.Location = EndPoint;
}
}
再加50分,请高手贴出代码和注释,谢谢!
niwalker 2002-08-04
  • 打赏
  • 举报
回复
在你的Form中定义一个变量:
private Point delta;

//在要移动的控件加上一个MouseDown的事件如下:

private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
Delta=new Point(-e.X,-e.Y);
}


//修改你的MouseMove事件代码如下:

private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
//如果点击左键并移动
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Point pos=pictureBox1.Counts.MousePosition;
pos.Offset(delta.X,delta.Y);
this.pictureBox1.Location = pos;
}
}
bgxy 2002-08-03
  • 打赏
  • 举报
回复
没有人知道吗?请高手不吝赐教!

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧