我正在为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时,它会闪烁并移动到每个地方.
我做错了什么?
的e.X
和e.Y
可相对于图像框(例如,如果鼠标在图片框的左上角,这是0,0).
对值imagenMapa.Left
和imagenMapa.Top
相对于所述形式(或任何控件包含imagenMapa
)
如果你试图在没有转换的情况下混合来自这两个系统的值,你就会得到跳跃(就像你所看到的那样).
你可能最好将鼠标位置转换为包含图片框的东西所使用的相同坐标系.
您可以使用imagenMapa.PointToScreen
在屏幕坐标中获取鼠标坐标(或Cursor.Position
直接获取位置),并将yourForm.PointToClient
其返回到表格坐标中.
请注意,根据您的需要,您可以通过覆盖/处理控件Paint
事件并自行绘制图像来完成"在控件中移动图像" .如果你这样做,你可以将所有内容保存在图片框坐标中,因为这些可能是你在调用时使用的内容graphicsObject.DrawImage
.
实际代码(需要.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; };