C#不能用鼠标拖动我的按钮

Posted

技术标签:

【中文标题】C#不能用鼠标拖动我的按钮【英文标题】:C# Can't drag my button with mouse 【发布时间】:2013-11-07 01:02:49 【问题描述】:

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

所以我问你! :-)

我试图在我的表单中运行的代码:

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。

提前谢谢你!

【问题讨论】:

当您单击应用程序上的按钮时,您是否正在尝试移动它们?这不会否定按钮的意义,因为它们只会四处移动......? 哦.. 你知道例如 iphone,应用程序可以作为按钮点击,但如果你按住屏幕,你可以编辑你想要应用程序的位置。我有点在创造一些东西,你可以在其中移动内容。 :) 您的目标是手机?视窗?表格? wpf? Windows :) 我想在学习时创建第二个桌面,这样我就可以更专注于学习,而不是桌面上的所有图标之类的东西。 您是否考虑过Fences 或类似this 的东西?它将节省您自己编写代码的时间,并且您可以专注于学习:) 【参考方案1】:

虽然我真的只是在 Windows 上复制粘贴 表格

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

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

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

现在运行它并拖动图片框1。

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

    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;
    

【讨论】:

该死的,我很愚蠢。很抱歉您的图标方便 :) 非常感谢!你在这里得到了公认的答案;)你为我解决了一个大问题! 你不傻……你在学习;这不是不便。一些事件处理程序确实可以在不需要连接的情况下工作。这些方法将以override 开头,并且名称通常以“On”开头,例如“OnClick”。你会发现其中的区别...继续编程! 在旁注中,某些语言实际上确实会自动将方法与特定事件关联起来,仅基于命名约定。 Microsoft 自己的旧版 VB6 以这种方式工作,MS Office 应用程序的 VBA 代码也是如此。 是同一个概念。无需对控件进行硬编码,而是将 sender 转换为正确的类型。我已经编辑了我的帖子。 只需将所有内容转换为 Control,Control ctl = (Control)sender;,并在该代码中使用“ctl”。如果 Button 触发了该事件,则不能将 Button 强制转换为 PictureBox,反之亦然。但是,它们都可以转换为 Control,因为它们派生自该类。【参考方案2】:

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

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

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

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

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

迈出小步,但要牢记大局:

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

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

【讨论】:

非常感谢!一些状态更新: - 仍然没有做任何拖放鼠标的事情 - 我已经使用 FlowLayoutPanel 像桌面一样创建 - 在桌面上添加了一个 NewFormIcon ,当你点击它时,它会在 form1 中打开一个 form2 ( MdiContainer)-全屏模式-退出应用程序(当然)但是不要指望我完成这个! ;) 我非常讨厌它。 万事开头难......如果你喜欢它,继续做......它会变得更容易...... :)

以上是关于C#不能用鼠标拖动我的按钮的主要内容,如果未能解决你的问题,请参考以下文章

我想写个unity3D C#脚本用鼠标拖动物体,该怎么办呀,

C# WinForms 用鼠标拖动控件

用鼠标滚轮拖动滚动条的时候老自动往上去

在WORD里拖动鼠标滑轮,页面不上上下走,而是放大缩小,怎么回事?

tkinter窗口鼠标拖动就会暂停

xshell拖动上传鼠标显示禁用