当前位置:  开发笔记 > 编程语言 > 正文

用鼠标移动PictureBox

如何解决《用鼠标移动PictureBox》经验,为你挑选了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时,它会闪烁并移动到每个地方.

我做错了什么?



1> Daniel LeChe..:

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

对值imagenMapa.LeftimagenMapa.Top相对于所述形式(或任何控件包含imagenMapa)

如果你试图在没有转换的情况下混合来自这两个系统的值,你就会得到跳跃(就像你所看到的那样).

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

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

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



2> theJerm..:

实际代码(需要.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;
};

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有