【问题标题】:How to catch mouse button events in another thread如何在另一个线程中捕获鼠标按钮事件
【发布时间】:2015-10-01 00:37:25
【问题描述】:

我是 WinForms 的新手,我对 MouseDown 和 MouseUp 事件有疑问(抱歉,如果我复制了它,但我无法用谷歌搜索它)。 所以,我有一个 PictureBox 并在上面绘制立方体。但我需要使用鼠标旋转它。我使用自动生成的事件 MouseDown、MouseUp、MouseMove。首先他们只是改变 bool 变量(这是愚蠢的检查方式,但我找不到更好的)。

    private void PictureBox_MouseDown(object sender, MouseEventArgs e)
    {
        RMBIsPressed = true;
    }

    private void PictureBox_MouseUp(object sender, MouseEventArgs e)
    {
        RMBIsPressed = false;
    }

在 MouseMove 中我做了 {} while(),它检查 RMBIsPressed 的状态并在需要时重新绘制立方体。

    private void PictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        Point mousePoint = MousePosition;
        Point mousePointNext;
        do
        {
            mousePointNext = MousePosition;
            if (mousePointNext != mousePoint)
            {
                if (mousePoint.X < mousePointNext.X)
                {
                    teta += deltaTeta;
                }
                else
                {
                    teta -= deltaTeta;
                }
                if (mousePoint.Y < mousePointNext.Y)
                {
                    phi += deltaPhi;
                }
                else
                {
                    phi -= deltaPhi;
                }
                PictureBox.Refresh();                    
                ViewTransformation();
                DrawCube();
            }
            mousePoint = MousePosition;
        } while (RMBIsPressed);
    }

当 MouseUp 事件第一次发生时,一切都很好,但在下一次迭代中 RMBIsPressed 仍然是 true,即使我释放了 RMB。 while 似乎会阻止 MouseUp 事件。我的问题是:我可以创建另一个线程来捕获 MouseUp 和 MouseDown 事件并更改 RMBIsPressed 的值吗?如果可以的话,请告诉我怎么做。

【问题讨论】:

  • 为什么你的 MouseMove 处理程序中有一个循环?每次移动鼠标时都会调用该处理程序。此代码很可能会完全锁定您的 UI。

标签: c# .net multithreading winforms


【解决方案1】:

do-while 循环不允许处理事件。

  • 将mousePoint 重命名为lastPosition 并使其成为实例变量。
  • 在MouseDown 和MouseMove 的末尾设置lastPosition。
  • 删除do-while 中的MouseMove

我还将PictureBox.Refresh 更改为PictureBox.Invalidate。这将避免鼠标移动非常快时闪烁。

【讨论】:

  • 不知道为什么有人反对这个。这是它应该做的方式。您可能还想考虑提到第四件事,即代码没有检查 which 按钮是否被按下,但变量使它看起来像是所需要的。
  • 非常感谢,它有帮助。很奇怪,PictureBox.Invalidate 不清楚PictureBox。我使用Graphics.FromImage(PictureBox.Image) 和DrawLine 绘制立方体。
【解决方案2】:

在您的do {} 结束时调用Application.DoEvents()。这将处理缓冲区中的 windows 消息,这意味着将处理鼠标向上事件。您可能还想在鼠标按下时捕获鼠标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多