【发布时间】:2015-06-06 10:22:55
【问题描述】:
我想将鼠标光标位置更改为集中控制。我通过键盘(回车键)改变焦点。我怎样才能做到这一点?
【问题讨论】:
-
我添加了一个使用控件的 Enter 事件的版本..
我想将鼠标光标位置更改为集中控制。我通过键盘(回车键)改变焦点。我怎样才能做到这一点?
【问题讨论】:
给你:
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。
我已经对其进行了测试,它可以工作,但是,如前所述,我宁愿不让光标跟踪我的焦点。让它成为一个选项,而不是一个功能!
【讨论】:
input 中的条件为真时,焦点会发生变化。就像一年中的textBox 一样,如果字符是 4 位数字,它将自动聚焦到下一个输入