【问题标题】:Change mouse cursor position to focused control将鼠标光标位置更改为集中控制
【发布时间】:2015-06-06 10:22:55
【问题描述】:

我想将鼠标光标位置更改为集中控制。我通过键盘(回车键)改变焦点。我怎样才能做到这一点?

【问题讨论】:

  • 我添加了一个使用控件的 Enter 事件的版本..

标签: c# winforms


【解决方案1】:

给你:

void goToActive()
{
    Control ctl = this.ActiveControl;
    this.Cursor = new Cursor(Cursor.Current.Handle);
    if (ctl != null) Cursor.Position = ctl.PointToScreen(new Point(3,3));
}

要从任何地方捕获您的导航键,请将 ProcessCmdKey 覆盖为 show here..:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Enter) { goToActive(); return true;}
    return base.ProcessCmdKey(ref msg, keyData);
}

更新:如果您不想按 Enter 键而是按控件的 Enter 事件,请按以下步骤操作:

我们在Form.Shown 事件中注册所有控件:

private void Form1_Shown(object sender, EventArgs e)
{
    registerAllControls(this);
}

这会递归地注册所有控件。您可能想根据自己的需要排除一些,可能检查名称、类型或Tag..:

void registerAllControls(Control ctl)
{
    ctl.Enter += ControlReceivedFocus;
    foreach (Control ct in ctl.Controls)
    {
        registerAllControls(ct);
    }
}

只有当我们不在这里时,我们才会调用修改后的goToActive 函数..:

void ControlReceivedFocus(object sender, EventArgs e)
{
    if (!((sender as Control).ClientRectangle
        .Contains(PointToClient(MousePosition))))
    {
        goToActive(sender);
    }
}

我已经修改了函数以包含调用控件,以使事情变得更容易..:

void goToActive(object sender)
{
    Control ctl = sender as Control;
    this.Cursor = new Cursor(Cursor.Current.Handle);
    Cursor.Position = ctl.PointToScreen(new Point(3, 3));
    if (sender is TextBox) Cursor = Cursors.IBeam; 
    else Cursor = Cursors.Default;
}

请注意,Cursor 倾向于选择错误的形状;我将其设置为Default,或者将TextBoxes 设置为IBeam

我已经对其进行了测试,它可以工作,但是,如前所述,我宁愿不让光标跟踪我的焦点。让它成为一个选项,而不是一个功能!

【讨论】:

  • 如何检测表单焦点的变化以使用此代码?
  • 通过覆盖ProcessCmdKey..
  • 但它是在按键事件上而不是聚焦!当input 中的条件为真时,焦点会发生变化。就像一年中的textBox 一样,如果字符是 4 位数字,它将自动聚焦到下一个输入
  • 好的,你可以看看this的回答。不被接受,但非常好 imo ..(虽然它缺少递归,但嵌套控件需要!!)或者,当然,要获得完全控制,您可以编写您想要参与的所有控件的 Enter 事件.. - 哦,顺便说一句,您确定您的用户会首先欣赏这一点吗?我怀疑我想让鼠标跳进我的领域..?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多