2

我正在为 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 时,它会闪烁并到处移动。

我做错了什么?

4

6 回答 6

6

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

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

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

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

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

请注意,根据您的需要,您可以通过覆盖/处理控件的Paint事件并自己绘制图像来完成“在控件中移动图像”。如果你这样做了,你可以把所有的东西都保存在图片框坐标中,因为当你调用graphicsObject.DrawImage.

于 2009-02-20T17:57:37.953 回答
6

实际代码(需要 .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;
};
于 2013-02-01T06:49:04.847 回答
1

eX & eY 在pictureBox 的坐标空间,imagenMapa.Left & imagenMapa.Top 在Form 的坐标空间。:-)

于 2009-02-20T17:58:12.133 回答
1

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

于 2009-02-20T19:10:02.773 回答
1

拥抱数学!

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

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

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

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

于 2012-05-19T00:06:21.183 回答
1

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

前任:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
  imagenMapa.Left = e.X;
  imagenMapa.Top = e.Y;
}
于 2017-02-08T10:23:39.333 回答