用鼠标移动PictureBox

时间:2009-02-20 17:44:52

标签: c# winforms picturebox onmousemove

我正在开发适用于Windows Mobile的应用程序(Compact Framework 2.0)。它有一个带有PictureBox的WinForms。

我想移动PictureBox的图像,但我不知道该怎么做,所以我选择移动孔PictureBox。

为此我使用此事件:

private void imagenMapa_MouseMove(object sender, MouseEventArgs e)
{
      imagenMapa.Left = e.X;
      imagenMapa.Top = e.Y;
      this.Refresh();
}

但是当我移动PictureBox时,它会闪烁并移动到每个地方。

我做错了什么?

6 个答案:

答案 0 :(得分:6)

e.Xe.Y相对于图片框(例如,如果鼠标位于图片框的左上角,则为0,0)。

imagenMapa.LeftimagenMapa.Top的值相对于表单(或任何控件包含imagenMapa

如果你尝试混合来自这两个系统的值而不进行转换,你就会得到跳跃(就像你看到的那样)。

最好将鼠标位置转换为包含图片框的东西所使用的相同坐标系。

您可以使用imagenMapa.PointToScreen在屏幕坐标中获取鼠标坐标(或Cursor.Position以直接获取位置),并使用yourForm.PointToClient将它们恢复到表格坐标中。

请注意,根据您的需要,您可以通过覆盖/处理控件的Paint event并自行绘制图像来完成“在控件内移动图像”。如果你这样做,你可以将所有内容保存在图片框坐标中,因为这些可能是你在调用graphicsObject.DrawImage时使用的内容。

答案 1 :(得分:5)

实际代码(需要.NET Framework 3.5及更高版本,不确定它是否在Compact Framework中可用)...

// Global Variables
private int _xPos;
private int _yPos;
private bool _dragging;

// Register mouse events
pictureBox.MouseUp += (sender, args) =>
{
    var c = sender as PictureBox;
    if (null == c) return;
    _dragging = false;
};

pictureBox.MouseDown += (sender, args) =>
{
    if (args.Button != MouseButtons.Left) return;
    _dragging = true;
    _xPos = args.X;
    _yPos = args.Y;
};

pictureBox.MouseMove += (sender, args) =>
{
    var c = sender as PictureBox;
    if (!_dragging || null == c) return;
    c.Top = args.Y + c.Top - _yPos;
    c.Left = args.X + c.Left - _xPos;
};

答案 2 :(得分:1)

e.X& e.Y位于pictureBox的坐标空间中,imagenMapa.Left& imagenMapa.Top位于Form的坐标空间中。 : - )

答案 3 :(得分:1)

另外不要忘记将表单设置为双缓冲,这可能有助于闪烁,但对于它的实际定位,我喜欢Daniel L'的建议

答案 4 :(得分:1)

拥抱数学!

control.Left = control.Left - (_lastMousePos.X - currentMousePos.X);
control.Top = control.Top - (_lastMousePos.Y - currentMousePos.Y);

快速解释: 您可以从鼠标位置获得差异并将其应用于要移动的对象。

实施例: 如果旧鼠标X位置为382,而新鼠标位置为385,则差值为-3。如果控制当前X位置是10然后10 - ( - 3)= 13

为什么: 它适用于任何事物,并且比不断地来回转换坐标要便宜得多。

答案 5 :(得分:0)

实际上你所做的是正确的。但是您将MouseMove属性赋予了图片框。您应该将该属性提供给表格(背景)。

例如:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
  imagenMapa.Left = e.X;
  imagenMapa.Top = e.Y;
}