ilovecomputer66 发表于 2023-7-29 09:24

C#中如何实现一个拼图游戏的拖拽交换两个碎片图?

本帖最后由 ilovecomputer66 于 2023-7-29 22:02 编辑

我用picbox作为每个随机碎片正方形图的展示容器

我只知道mouseDown能监听到在某个碎片上鼠标按住,但是我想监听按下后拖拽移动,应该监听什么事件?试了下,不是MouseMove也不是Move,因为他俩就触发一次,而不是移动过程中时刻触发

ilovecomputer66 发表于 2023-7-29 09:28

我大致思路就是,先监听按下,然后标记已经按下。然后不知道什么能监听它一直移动,如果能实现,然后在移动过程中,计算与按下时鼠标位置的delta值,从而计算出碎片现在的位置,然后设置其位置为现在的位置

(都是技术版区,请讨论技术问题。然后想比如不做成拖拽,点击交换这种程序员可以离开了)

adamfh 发表于 2023-7-29 10:14

你为什么要监听按下后拖拽移动这个事件?
没必要啊

按下后,高亮显示被选定的方块
再次按下后,鼠标再次选定的方块,与之前高亮显示的方块对换

再处理一下意外情况就完了。

apull 发表于 2023-7-29 10:31

mouseDown里isDown=true
MouseMove里判断isDown后进行计算和移动
MouseUp里isDown=false

saidom1949 发表于 2023-7-29 12:42

mousedown+mousemove

ccbbaa 发表于 2023-7-29 14:26

如果您想要在拖动图片的过程中持续监听鼠标移动事件,您可以尝试使用drag事件。这个事件会在鼠标拖动的时候持续触发。

以下是一个基本的示例,展示了如何使用drag事件:

javascript
box.on('drag', function(ev) {
// 在这里添加处理拖动事件的代码
console.log('正在拖动图片:', ev.target);
});
在这个示例中,当您拖动图片时,将会打印出正在被拖动的图片的信息。

lcjok92021 发表于 2023-7-29 14:54

ccbbaa 发表于 2023-7-29 14:26
如果您想要在拖动图片的过程中持续监听鼠标移动事件,您可以尝试使用drag事件。这个事件会在鼠标拖动的时候 ...

您推荐是好像是js代码,版主需要是的C#代码。{:1_907:}

Broadm 发表于 2023-7-29 15:11

public partial class MainWindow : Form
{
    public MainWindow()
    {
      InitializeComponent();

      StartPosition = FormStartPosition.CenterScreen;

      pictureBox1.Cursor = Cursors.SizeAll;
      pictureBox1.MouseDown += PictureBox1_MouseDown;
      pictureBox1.MouseMove += PictureBox1_MouseMove;
      pictureBox1.MouseUp += PictureBox1_MouseUp;
    }

    private bool _isMouseDown = false;
    private Point _startLocation;
    private int _startX;
    private int _startY;

    private void PictureBox1_MouseDown(object? sender, MouseEventArgs e)
    {
      _isMouseDown = true;
      pictureBox1.Capture = true;
      _startX = e.X + pictureBox1.Left;
      _startY = e.Y + pictureBox1.Top;
      _startLocation = pictureBox1.Location;
    }


    private void PictureBox1_MouseMove(object? sender, MouseEventArgs e)
    {
      if (!_isMouseDown)
      {
            return;
      }

      var x = e.X + pictureBox1.Left;
      var y = e.Y + pictureBox1.Top;

      var diffX = x - _startX;
      var diffY = y - _startY;

      var left = diffX + _startLocation.X;
      var top = diffY + _startLocation.Y;

      pictureBox1.Left = left;
      pictureBox1.Top = top;
    }

    private void PictureBox1_MouseUp(object? sender, MouseEventArgs e)
    {
      _isMouseDown = false;
      pictureBox1.Capture = false;
    }


    private void Window_Load(object sender, EventArgs e)
    {

    }
}

Bszk 发表于 2023-7-29 15:27

本帖最后由 Bszk 于 2023-7-29 15:28 编辑

在win窗口查询中,如果想要实现鼠标离开组件还触发move消息的话,想要在按下中使用SetCapture(组件句柄)捕获鼠标,在不需要的时候ReleaseCapture ()释放鼠标。
关于这两个api,可以去msdn看官方文档

我不玩c#,但是这是win窗口相关的知识,可能c#窗口操作已经涵盖了

ilovecomputer66 发表于 2023-7-29 20:15

adamfh 发表于 2023-7-29 10:14
你为什么要监听按下后拖拽移动这个事件?
没必要啊



我2楼括号里就是提前预料,一定会有你这种程序员,不钻研技术,破坏用户体验只为自己省事
页: [1] 2
查看完整版本: C#中如何实现一个拼图游戏的拖拽交换两个碎片图?