C# 如何使图片盒可拖动?

C# 如何使图片盒可拖动?,c#,winforms,operating-system,C#,Winforms,Operating System,我是一个热心的程序员,对堆栈溢出还不熟悉。 我正在尝试用C#构建一个操作系统的原型……只是一个测试 就像我们看到的,我们可以把东西拖到桌面上,放在我为我的操作系统创建桌面的任何地方 那么,我应该如何使图标(图片盒)可以拖动,以及如何保存其位置,以便下次打开桌面时可以在同一位置看到它? 我会喜欢没有任何冻结或那些鬼鬼祟祟的虫子拖动。我想如果,它是接近和顺利的窗口(拖动项目(图标)在桌面上) 谢谢……是的,是的 假设有一个名为“pbxBigCat”的Picturebox(加载一张图片…) 将以下行添

我是一个热心的程序员,对堆栈溢出还不熟悉。 我正在尝试用C#构建一个操作系统的原型……只是一个测试

就像我们看到的,我们可以把东西拖到桌面上,放在我为我的操作系统创建桌面的任何地方

那么,我应该如何使图标(图片盒)可以拖动,以及如何保存其位置,以便下次打开桌面时可以在同一位置看到它? 我会喜欢没有任何冻结或那些鬼鬼祟祟的虫子拖动。我想如果,它是接近和顺利的窗口(拖动项目(图标)在桌面上)

谢谢……

是的,是的

假设有一个名为“pbxBigCat”的Picturebox(加载一张图片…)

将以下行添加到表单中:

    public const int WM_NCLBUTTONDOWN = 0xA1;
    public const int HT_CAPTION = 0x2;

    [DllImportAttribute("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    [DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();
然后为pbxBigCat MouseDown事件编写事件处理程序:

    private void pbxBigCat_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            ReleaseCapture();
            SendMessage(pbxBigCat.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
        }
    }
如果你测试它,你会发现它是有效的。有关更多信息(如保存职位等),我参考

这是另一种可能性(现在我们有了一个名为label1的标签)


从上述SO文章的示例中提取的所有内容。

wpf?winforms?可能是web?C#,winforms bro.。我原以为代码可以很好地工作,但实际上什么都没有发生,我甚至在表单上尝试过,您给我的推荐链接中没有关于如何保存职位的信息。然后您没有阅读完整的线程。您可以使用mousemove事件获取实际位置,然后保存它以供使用。我再次尝试,它正在运行。我可以在图片周围移动。请查看新的替代方法以满足您的要求。谢谢兄弟。另一种方法非常有效。你是最棒的。非常感谢。
public partial class Form1 : Form
{
    private bool mouseDown;
    private Point lastLocation;

    public Form1()
    {
        InitializeComponent();
    }

    private void pbxBigCat_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            mouseDown = true;
            lastLocation = e.Location;
        }
    }

    private void pbxBigCat_MouseMove(object sender, MouseEventArgs e)
    {
        if (mouseDown)
        {
            pbxBigCat.Location = new Point((pbxBigCat.Location.X - lastLocation.X + e.X), (pbxBigCat.Location.Y - lastLocation.Y) + e.Y);
            label1.Text = pbxBigCat.Location.X.ToString() + "/" + pbxBigCat.Location.Y.ToString();
        }
    }

    private void pbxBigCat_MouseUp(object sender, MouseEventArgs e)
    {
        mouseDown = false;
    }
}