如何使图片框可拖动?

时间:2016-05-19 05:12:40

标签: c# winforms operating-system

我是一位热心的程序员,也是堆栈溢出的新手。 我正在尝试用C#构建OS(操作系统)的原型......只是一个测试。

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

那么我应该如何制作一个可拖动的图标(图片框)以及如何保存其位置以便下次打开桌面时我会在同一个地方看到它? 我会喜欢拖动没有任何冻结或那些偷偷摸摸的错误。我很乐意,如果它与Windows中的那些一样接近和平滑(在桌面中拖动项目(图标))..

...谢谢

1 个答案:

答案 0 :(得分:0)

是的,是的。

假设一个名为“pbxBigCat”的Picturebox(用pPicture加载它......)

将此行添加到表单中:

    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事件编写一个eventhandler:

    private void pbxBigCat_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            ReleaseCapture();
            SendMessage(pbxBigCat.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
        }
    }

如果你进行测试,你会发现它有效。有关更多信息(如保存职位等),我引用Make a borderless form movable?

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

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;
    }
}

从上述SO文章的例子中得出的一切。