水平或垂直移动控件,而不是两者的组合

2023-12-30

我在这里熬夜,围绕着几行代码试图解决问题。

下面的代码将控件设置为能够在其父控件内移动到任何位置。

然而,此代码允许向任何方向移动,我想将其移动限制在 X 或 Y 轴,这意味着用户可以水平或垂直移动它,而不是两者的组合。

Point lastPosition = Point.Empty;

control.MouseDown += (sender, evt) =>
{
   lastPosition = evt.Location;
};

control.MouseMove += (sender, evt) =>
{
   // This moves the control anywhere.
   // I only want to move in one direction (left<->right  or  top <-> down) never diagonally
   // Not sure how to first find which direction the user wants to move, 
   // nor how to restrict the movement to only one of the directions mentioned
   int x = last.X + movingPiece.Left - mouseDownLocation.X;
   int y = last.Y + movingPiece.Top - mouseDownLocation.Y;
   movingPiece.Left = x;
   movingPiece.Top = y;
};

Thanks

我的感谢汉斯·帕桑特 https://stackoverflow.com/a/25591801/114298 and TaW https://stackoverflow.com/a/25590312/114298我从他们的答案中提取了构建小型 2D 引擎的想法,该引擎能够划定多个控件可以在面板容器内移动的区域,同时考虑到碰撞检测、预防和控制移动方向约束根据需要由许多自定义因素强加。我想接受这两个答案,但由于这是不可能的,所以我接受了对相关问题提供最深入了解的答案。


这是一个例子。我添加了一个脚本小Panel“一块”到更大的Panel'木板'。

我检查最小增量,这样颤抖的手就不会开始运动。

一个标志跟踪运动,另一个标志跟踪方向,“0”表示“尚未”决定。

bool pieceMoving = false;
byte pieceDirection = 0;
Point startPosition = Point.Empty;

private void AddPieceButton_Click(object sender, EventArgs e)
{
    Panel newPiece = new Panel();
    newPiece.Size = new Size(16, 16);
    newPiece.BackColor = Color.Blue;

    pan_board.Controls.Add(newPiece);

    newPiece.MouseDown += (sender2, evt) => 
           { pieceMoving = true;  pieceDirection = 0; startPosition = evt.Location; };
    newPiece.MouseUp += (sender2, evt) => 
           { pieceMoving = false; pieceDirection = 0;};
    newPiece.MouseMove += (sender2, evt) =>
    {
        int delta = 0;
        if (!pieceMoving) return;
        if (pieceDirection == 0)
        {
            int deltaX = Math.Abs(startPosition.X - evt.X);
            int deltaY = Math.Abs(startPosition.Y - evt.Y);
            delta = deltaX + deltaY;
            if (deltaX == deltaY) return;
            if (delta  < 6) return;  // some minimum movement value
            if (deltaX > deltaY) pieceDirection = 1; else pieceDirection = 2;
        }   
        // else if (delta == 0) { pieceDirection = 0; return; }  // if you like!
        Panel piece = (Panel) sender2;
        if (pieceDirection == 1) piece.Left += evt.X; else piece.Top += evt.Y;

    };

由于我已将代码放入Button单击,我将发件人命名为“sender2”,并使用它来允许将相同的代码用于多个部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

水平或垂直移动控件,而不是两者的组合 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • 如何通过VSTS构建和部署SSRS项目?

    我在 VS2015 中创建了简单的 SSRS 项目 我想通过创建构建定义和发布定义步骤来使用 VSTS 构建和部署 SSRS 项目 是否有任何第三方 VSTS 扩展可用 或者对于 SSRS 构建和 SSRS 部署与 SSIS 构建和 SSI
  • 子类化流

    我有兴趣创建自己的 Stream 子类 并且想知道应该重写哪些方法 部署在 pharo 和 Gemstone 上 我有一个包含各种类型事物的集合 我希望能够流式传输它的子集 其中包含类的元素 我不想复制集合或使用collect 块 因为集合
  • 在 CAB 中部署 C# ActiveX 以供 Internet Explorer 使用

    我正在拼命尝试部署一个用 C 开发的 IE 的 ActiveX 作为 CAB 存档 我阅读了很多资源 其中一些来自 StackOverflow 似乎很多人都遇到了同样的问题 我尝试了 3 种解决方案 a 创建 CAB VS 项目 b 使用手
  • SQL Server 2005:读提交事务隔离级别中的键范围锁?

    我正在帮助解决使用 SQL Server 2005 的 NET 应用程序中的一些死锁问题 我从下面的跟踪中获得了 XML 数据 真正让我困惑的是 RangeX X 锁定PK Exp Experience PriorFirm当事务隔离级别为读
  • Android 图像的 AES 加密/解密

    我需要找到一种在 Android 中加密 解密图像的方法 我是 Android 编程新手 从未在任何其他平台上加密 解密过 所以请给我一个很好的例子 因为我需要学习如何做到这一点 我正在开发一个需要加密 解密图像的项目 如果您能帮助我解决这
  • 如何在Excel中使用vba访问xml中的特定元素和属性?

    我正在努力让 Excel 解析 xml 文件 我找到了大量的示例 但似乎没有一个完全符合我的要求 而且我似乎无法克服错误 对象变量或未设置块变量 该 xml 格式良好 如下所示
  • 如何在绘图上绘制带注释的热图?

    我正在尝试制作一个带注释的热图 import plotly plotly as py import plotly tools as tls from plotly graph objs import import numpy as np i
  • PHP 单行语句中的 Netbeans 代码格式大括号

    Intro 我正在开发 PHPNetBeans IDE 7 2 Build 201207171143 我喜欢formatting以我的自定义格式清理我的代码 目前我与同事在一个小组中工作 我的一些同事习惯于编写不带大括号的单行语句 我认为这
  • 将 C 字符串转换为双精度数或从双精度数转换时出现奇怪的行为

    我无法理解 C 的规则 即在打印双精度数或将字符串转换为双精度数时应采用何种精度 下面的程序应该可以说明我的观点 include
  • 视图控制器有时收不到 NSNotification

    所以 我只是在各种情况下测试 NSNotifications 而这个令人困惑 如果您能帮助我理解 NSNotifications 我将不胜感激 我有一个导航控制器 我有一个名为 Add 的 UIBarButtonItem 它发布通知 Did
  • PHP regex - 检测未闭合的括号

    我需要检测字符串是否包含任何未闭合的尖括号 我试图通过比较左括号和右括号的数量来避免使用正则表达式 if substr count string lt substr count string gt Text contains unclose
  • python字节码中的加载名称和加载全局有什么区别?

    load name 接受其参数 并将 store name 存储的名称值推入堆栈 该值由参数指示的位置存储 load global 做了类似的事情 但字节码中似乎没有 store global 那么有什么区别以及如何加载全局工作 和 之间的
  • 在 LLDB 中保存断点

    如何在 lldb 中保存断点 这是 gdb 具有的功能 我怀疑 lldb 也具有它 但我无法在帮助中找到它 这是如何在 gdb 中完成的 让 gdb 保存断点列表 https stackoverflow com questions 5014
  • 社交图标无法与 WordPress 上的无限滚动一起使用

    我们正在为工作中的客户制作一个网站 可以在这里找到 http ethercreative net studio social http ethercreative net studio social 这是一个非常简单的 WordPress
  • UITableViewCell:允许选择性删除

    我有一个表视图并希望允许对所有单元格重新排序 但是我不希望删除某些单元格 当 UiTableView 进入删除模式时 我不希望红色 按钮出现在左侧 并且不希望滑动手势调出这些单元格的 删除 按钮 但希望其他单元格也出现这种情况 有任何想法吗
  • 通过游戏中心发送 NSString

    我想通过 Gamecenter 将 NSString 从另一台 iPhone iPad 发送到另一台 iPhone iPad 但它因 EXC BAD ACCESS 崩溃 在 h 文件中 typedef enum kMessageTypeRa
  • 如何在 Keras 中创建随纪元变化的损失函数

    我想创建一个自定义损失函数 其中的权重项根据我所处的时代进行更新 例如 假设我有一个损失函数beta权重 其中 beta 在前 20 个时期内增加 def custom loss x x pred loss1 objectives bina
  • 如何在 BB10 中实现带滚动的 GRID/TILED 图像视图

    我想实现网格 平铺图像视图 其中平铺图像将在下载后动态绘制 我希望能够在其中执行捏合 缩放和其他触摸操作 假设 如果我平移视图 新图块将被加载并全部或部分绘制在视图上 我找不到使用任何现有 UI 控件来完成此操作的方法 此外 那些现有的 U
  • Python Selenium:我收到元素未附加到页面文档错误

    我正在尝试使用 python 的 selenium 包构建一个刮刀 但出现此错误 Message stale element reference element is not attached to the page document Se
  • 水平或垂直移动控件,而不是两者的组合

    我在这里熬夜 围绕着几行代码试图解决问题 下面的代码将控件设置为能够在其父控件内移动到任何位置 然而 此代码允许向任何方向移动 我想将其移动限制在 X 或 Y 轴 这意味着用户可以水平或垂直移动它 而不是两者的组合 Point lastPo