按回车跳转窗体焦点
"按回车跳转窗体焦点?"
回想几年前我写程序的时候,第一次碰到这个需求。每个界面上的控件都写了一次编码;后来控件多了,动态绑定事件;自定义控件多了,就用了控件继承。但处理的结果并不理想,因为并不是每个操作员都喜欢用Enter跳转焦点;团队开发的时候,不是每一个程序员都接受你的要求,往往漏掉处理某些自定义的控件;最大的缺点是,按钮的默认事件Click事件不能写代码了,带来技术上的沟通障碍。
现在问题解决了。
我的工程里面有个中国操作员操作习惯的基类窗体,一段代码一劳永逸的解决了所有的问题;让团队用正常的处理方式专注功能开发。
首先描述一下需求:
1. 原Windows焦点跳转方式不变,这是为了我们新生代的电脑操作员不用染上坏习惯;
2. 增加按[Enter]跳转焦点到下一控件,按[Shift+Enter]跳转焦点到上一控件;
3. 焦点所在按钮时按[Enter]不触发Click事件,这是开发团队内部的要求;
4. 焦点按钮按[空格]触发Click事件,这是客户的需求。
5. 文本框接受[Enter]的不跳转焦点,不接受[Enter]的跳转焦点。
我的窗体处理代码是这样的:
1/// <summary>
2/// 按键处理
3/// </summary>
4/// <param name="msg">按键消息</param>
5/// <param name="keyData">按键数据</param>
6/// <returns></returns>
7protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
8{
9 //判断:
10 // 按键是否为[Enter]
11 if (keyData == Keys.Enter)
12 {
13 //成立执行
14 //判断:
15 //活动控件不是System.Windows.Forms.TextBox或System.Windows.Forms.TextBox继承类
16 // 或
17 // 活动控件是System.Windows.Forms.TextBox或System.Windows.Forms.TextBox继承类但不接受[Enter]
18 if (
19 !(ActiveControl is System.Windows.Forms.TextBox) ||
20 ((System.Windows.Forms.TextBox)ActiveControl).AcceptsReturn == false
21 )
22 {
23 //成立执行
24 //模拟按下[Tab]
25 SendKeys.SendWait("{Tab}");
26
27 //截停[Enter]消息
28 return true;
29 }
30 }
31
32 //判断
33 // 按键是否为[Shift+Enter]
34 if (keyData == (Keys.Enter | Keys.Shift))
35 {
36 //成立执行
37 //模拟按下[Shift+Tab]
38 SendKeys.SendWait("+{Tab}");
39
40 //截停[Shift+Enter]消息
41 return true;
42 }
43
44 //非按下[Enter]继续处理
45 return base.ProcessCmdKey(ref msg, keyData);
46}
47
2/// 按键处理
3/// </summary>
4/// <param name="msg">按键消息</param>
5/// <param name="keyData">按键数据</param>
6/// <returns></returns>
7protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
8{
9 //判断:
10 // 按键是否为[Enter]
11 if (keyData == Keys.Enter)
12 {
13 //成立执行
14 //判断:
15 //活动控件不是System.Windows.Forms.TextBox或System.Windows.Forms.TextBox继承类
16 // 或
17 // 活动控件是System.Windows.Forms.TextBox或System.Windows.Forms.TextBox继承类但不接受[Enter]
18 if (
19 !(ActiveControl is System.Windows.Forms.TextBox) ||
20 ((System.Windows.Forms.TextBox)ActiveControl).AcceptsReturn == false
21 )
22 {
23 //成立执行
24 //模拟按下[Tab]
25 SendKeys.SendWait("{Tab}");
26
27 //截停[Enter]消息
28 return true;
29 }
30 }
31
32 //判断
33 // 按键是否为[Shift+Enter]
34 if (keyData == (Keys.Enter | Keys.Shift))
35 {
36 //成立执行
37 //模拟按下[Shift+Tab]
38 SendKeys.SendWait("+{Tab}");
39
40 //截停[Shift+Enter]消息
41 return true;
42 }
43
44 //非按下[Enter]继续处理
45 return base.ProcessCmdKey(ref msg, keyData);
46}
47