为什么Cursor.Show()和Cursor.Hide()没有立即隐藏或显示光标?

时间:2011-10-03 19:09:20

标签: c# winforms

我正在为可视化工具编写一个拖动系统。单击并拖动时,它会移动您在窗口中看到的内容。当鼠标击中面板边缘时,我开始重新定位光标,使其永远不会离开框。它跟踪光标在盒子内部的虚拟位置。这部分代码工作正常。

只要有一个MouseMoved事件且位置在框内,我就会执行Cursor.Show()。如果它在框外,我会做Cursor.Hide()。当用户放开鼠标按钮时,我执行Cursor.Show()。

有很多问题。当第一次Hide调用发生时,它不会隐藏。我必须将光标的虚拟位置移到包含窗口之外才能发生隐藏。当我搬回来时,即使正在调用Show,它也不会变得可见。最后,当释放鼠标按钮时,尽管显示被调用,光标也不会出现。

而不是要求人们调试我的代码,我只是想知道事件系统中发生了什么使得Cursor.Hide / Show不能按照我期望的方式工作。我的印象是,如果一个名为Hide的控件,光标会在该控件内部被隐藏;同样,如果我从控制中调出show。

3 个答案:

答案 0 :(得分:11)

对于遇到此问题的人,请尝试以下方式:

    private bool _CursorShown = true;
    public bool CursorShown
    {
        get
        {
            return _CursorShown;
        }
        set
        {
            if (value == _CursorShown)
            {
                return;
            }

            if (value)
            {
                System.Windows.Forms.Cursor.Show();
            }
            else
            {
                System.Windows.Forms.Cursor.Hide();
            }

            _CursorShown = value;
        }
    }

并使用它:

CursorShown = false; // Will hide the cursor
CursorShown = false; // Will be ignored
CursorShown = true; // Will show the cursor
CursorShown = true; // Will be ignored

答案 1 :(得分:9)

汉斯在评论中提到了这一点。既然这个问题有答案,我觉得应该有答案。

“计算。两个节目和一个隐藏不会隐藏光标。” - 汉斯帕斯特

答案 2 :(得分:0)

您可以简化它

      //Whenever you want to hide the cursor           
       Cursor.Hide();
       countCursorHide++;

并显示光标

    int countCursorHide = 0;
    private void showCursor()
    {
        for (int i = 0; i < countCursorHide; i++)
        {
            Cursor.Show();
        }
        countCursorHide = 0;
    }