我在这里熬夜,围绕着几行代码试图解决问题。
下面的代码将控件设置为能够在其父控件内移动到任何位置。
然而,此代码允许向任何方向移动,我想将其移动限制在 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(使用前将#替换为@)