- 按回车键执行了什么?在哪里处理回车键的事件?
有确定按钮的窗体
无确定按钮的窗体 - 输入焦点怎样跳到下一个控件
- 例子程序
有确定按钮的窗体的例子
无确定按钮的窗体的例子
一. 按回车键执行了什么?在哪里处理回车键的事件?
1. 有确定按钮的窗体
一般情况,如果窗体上有确定按钮,把这个按钮的 Default 属性设为 true;如果窗体上有取消按钮,把这个按钮的 Cancel 属性设为 false,这样就可以用最简单的方法处理回车和 Esc 键执行的内容。
- 如果按钮的 Default 属性设为 true,按键盘的回车键会执行点击这个按钮;
- 如果按钮的 Cancel 属性设为 true,按键盘的 Esc 键会执行点击这个按钮;
- 如果按钮的 Default 属性和 Cancel 属性都设为 true,按键盘的回车键和 Esc 键都会执行点击这个按钮。
2. 无确定按钮的窗体
如果没有确定按钮,需要使用窗体的 KeyPreview 属性和窗体的键盘按键事件。
- 默认情况下,窗体的 KeyPreview 属性为 false,如果窗体上存在有输入焦点的控件,那么键盘输入都被定向到了这个控件,窗体的按键事件就不会被触发和执行;
- 如果窗体的 KeyPreview 属性设为 true,那么无论是否存在有输入焦点的控件,窗体的按键事件都会被触发和执行。
二. 输入焦点怎样跳到下一个控件
窗体的 ActiveControl 属性:指向当前有焦点的控件;
窗体的 FindNextControl 方法:寻找下一个控件。
TWinControl* __fastcall FindNextControl(TWinControl* CurControl, bool GoForward, bool CheckTabStop, bool CheckParent);
参数 | 说明 |
---|---|
TWinControl* CurControl | 从这个控件开始找 |
bool GoForward | true: 找下一个; false: 找上一个 |
bool CheckTabStop | true: 控件的 TabStop 属性必须为 true; false: 不检查控件的 TabStop 属性 |
bool CheckParent | true: 找到的是容器,不会在这个容器里面找控件; false: 找到的是容器,在这个容器里面找控件 |
从当前有焦点的控件 ActiveControl 开始,找下一个有 TabStop 的控件,如果找到,就让这个控件获取焦点:
TWinControl *lpNext = FindNextControl(ActiveControl, true, true, false);
if(lpNext != NULL)
{
lpNext->SetFocus();
}
三. 例子程序
1. 有确定按钮的窗体的例子
这是通用的办法,只要有 “OK” 或 “确定” 按钮,就可以用这个办法,而且代码也是通用的,不用修改。
把 OK 按钮的 Default 属性设为 true,在 OK 按钮的点击事件里面写:
void __fastcall TForm1::BtnOKClick(TObject *Sender)
{
if(Sender != ActiveControl)
{
TWinControl *lpNext = FindNextControl(ActiveControl, true, true, false);
if(lpNext != NULL && lpNext != Sender)
{
lpNext->SetFocus();
return;
}
}
ShowMessage(L"真正的处理点击 OK 按钮的内容");
}
运行结果:只要输入焦点不在按钮上,回车就会把输入焦点跳到下一个控件上。
2. 无确定按钮的窗体的例子
这是通用的方法,Form 的 KeyPreview 属性设为 true,然后处理 Form 的 OnKeyDown 事件。
Form 的 OnKeyDown 事件:
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
if(Key == VK_RETURN)
{
TWinControl *lpNext = FindNextControl(ActiveControl, true, true, false);
if(lpNext != NULL)
{
lpNext->SetFocus();
}
}
}
运行结果:回车会把输入焦点跳到下一个控件。