【问题标题】:C# WinForms - Event to detect mouse pointer moved to lower left corner of form or windowC# WinForms - 检测鼠标指针移动到窗体或窗口左下角的事件
【发布时间】:2019-06-23 22:20:08
【问题描述】:

默认情况下,文本框控件的可见属性设置为 false。当用户将鼠标指针移动到窗口/表单的左下角时,应该会显示文本框。当鼠标从左下角移开时,它应该会再次变得不可见。

我尝试过的:

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (Bounds.Contains(10, 100) && !coolTextBox.Visible)
        {
            coolTextBox.Visible = true;
        }
        else
        {
            coolTextBox.Visible = false;
        }
    }

我认为我检查鼠标指针是否在左下角的 if 语句条件不正确。此外,这有点棘手,因为表单/窗口可以由用户调整大小,所以我也必须考虑到这一点。文本框本身也位于左下角。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    旁注;由于与用户体验的人类心理有关的各种原因,这很可能是一个相当糟糕的 UI 想法(阅读神秘肉导航 - 默认情况下,隐藏应该与之交互的方式的 UI 设计不佳)并且还使事情变得困难对于触摸用户

    您的表单的 0,0 在左上角,因此您将需要使用 ClientSize 属性来返回边框栏内的表单区域的大小,控件可能位于该区域。我们这样做是为了评估,考虑到窗体的高度可能会改变,鼠标指针是否在窗口底部附近

    您的鼠标移动事件将具有 X 和 Y 坐标 - 使用它们来确定鼠标是否位于左下角的 10x10 区域中:

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
      coolTextBox.Visible = (e.X < 10 && e.Y > this.ClientSize.Height -10);
    }
    

    我建议使用客户端大小,因为我认为不会为标题栏触发 Mousemove 事件。如果我错了,他们错了,并且当指针触及客户区域的最顶行(标题栏下方)时,e.Y 包含例如 20,请改用this.Height(我在手机上,不能测试一下)

    【讨论】:

    • 这只是我台式电脑上的个人项目。该代码对我不起作用。你能写下整个代码,让我知道我做得对吗?
    • 这行代码是 mousemove 事件处理程序中唯一的行 - 已编辑。如果仍然出现问题,请在代码行上设置断点,运行应用程序,然后非常小心地将指针从窗口外引入窗体的左下角(不要用鼠标触摸窗口,否则调试器会中断,你会去检查这些值,它们会出错,你会恢复,它会再次中断..并进入一个难以摆脱的循环)
    • 还是不行。使用 FormBorderStyle = FormBorderStyle.None; 窗口是无边框的
    • @EsAMe 贴出的代码可以正常工作,但是数值设置的太低了,尝试将它们设置为coolTextBox.Visible = (e.X this.ClientSize.Height -100);
    • 是的,我不确定什么是合理的“左下角” - 随意尝试通过将 10 更改为不同值给出的像素,这符合您对多大的胃口一个命中框的“左下角”被认为是
    【解决方案2】:

    您可以使用 TextBox 本身的大小来确定左下角。这对我来说适用于不同的缩放选项。此外,请确保您已连接 MouseMove 事件。这里我在构造函数中做,但你也可以通过设计器来做:

    public Form1()
    {
        InitializeComponent();
        this.MouseMove += Form1_MouseMove;
    }
    
    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        coolTextBox.Visible = coolTextBox.ClientRectangle.Contains(coolTextBox.PointToClient(Cursor.Position));       
    }
    

    【讨论】:

    • 那么您的设置描述得不够好,或者您未能正确实施建议。你说表单是无边界的,但用户可以调整表单的大小......所以你必须有允许这样做的代码。这些东西可能相互冲突。向我们展示更多代码...
    • 你是对的。我创建了一个新项目,它正在运行,但在我原来的项目中却没有。可能是因为我有一些相互冲突的怪癖。
    猜你喜欢
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    相关资源
    最近更新 更多