0

所以我在谷歌上搜索了一下,找到了一些用鼠标拖动按钮的代码。我发现了很多,尽管这些都不适合我。

所以我问你!:-)

我试图以我的形式工作的代码:

bool isDragged = false;
  Point ptOffset;
  private void button1_MouseDown( object sender, MouseEventArgs e )
  {
     if ( e.Button == MouseButtons.Left )
     {
        isDragged = true;
        Point ptStartPosition = button1.PointToScreen(new Point(e.X, e.Y));

        ptOffset = new Point();
        ptOffset.X = button1.Location.X - ptStartPosition.X;
        ptOffset.Y = button1.Location.Y - ptStartPosition.Y;
     }
     else
     {
        isDragged = false;
     }
  }

  private void button1_MouseMove( object sender, MouseEventArgs e )
  {
     if ( isDragged )
     {
        Point newPoint = button1.PointToScreen(new Point(e.X, e.Y));
        newPoint.Offset(ptOffset);
        button1.Location = newPoint;
     }
  }

  private void button1_MouseUp( object sender, MouseEventArgs e )
  {
     isDragged = false;
  }

我当然把pictureBox1改成了button1。

但我就是不能让它工作。

有谁可能知道为什么?

哦,我想在我的所有按钮上使用它,那么我应该用什么替换 button1 以使其在所有按钮上都起作用?

-顺便说一句,我使用 Visual Studio Express。

先感谢您!

4

2 回答 2

1

好的,好消息:希望您完成后我们会有一个 CSI 桌面布局。

不太好的消息:我认为你试图做错事。

我假设您使用的是 WinForms,但 WPF 的想法应该是相同的。当你运行你的程序时,布局被设置(或者是动态的,例如当你调整窗口大小时它会改变,或者是静态的,例如当你用绝对 X,Y 位置设置它时)。

您想要做的是:我想从他们创建所有样板代码中获得好处,但是,我想在运行时动态更改它......

我认为您需要重新考虑您的方法,并一次迈出这一步(毕竟,微软花了几年时间才将 GUI 带到现在的位置......这需要一些时间来获得酷炫的未来主义GUI出来了)。

采取婴儿步骤,但请记住大局:

  • 从定义 Canvas 开始。
  • 然后,您可以在其上放置一个按钮。
  • 然后在画布上移动那个按钮。(您的问题中的代码应该适用于画布上的对象)。

从那里开始,继续采取措施,让您更接近目的地......

于 2013-11-07T01:40:59.033 回答
1

即使我真的只是在涉及 Windows 窗体时复制粘贴

您发布的代码实际上不会自己做任何事情!

要工作,控件的 MouseDown() 和 MouseMove() 事件必须连接到这些方法:

  1. 选择窗体上的控件 (pictureBox1)。
  2. 在属性窗格(默认右下角)中,单击“闪电”图标以获取该控件的事件列表。
  3. 找到该MouseDown条目并将其右侧的下拉列表更改为pictureBox1_MouseDown
  4. 找到该MouseMove条目并将其右侧的下拉列表更改为pictureBox1_MouseMove

现在运行它并拖动pictureBox1。

编辑:这是使代码适用于多个控件的方法,如下面的评论中所述。

    bool isDragged = false;
    Point ptOffset;

    private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            isDragged = true;
            Button btn = (Button)sender;
            ptOffset = new Point(btn.Location.X - Cursor.Position.X, btn.Location.Y - Cursor.Position.Y);
        }
        else
        {
            isDragged = false;
        }
    }

    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDragged)
        {
            Point newPoint = Cursor.Position;
            newPoint.Offset(ptOffset);
            Button btn = (Button)sender;
            btn.Location = newPoint;
        }
    }

    private void button1_MouseUp(object sender, MouseEventArgs e)
    {
        isDragged = false;
    }
于 2013-11-07T02:17:04.690 回答