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#脚本用鼠标拖动物体,该怎么办呀,