按回车跳转窗体焦点
"按回车跳转窗体焦点?"
回想几年前我写程序的时候,第一次碰到这个需求。每个界面上的控件都写了一次编码;后来控件多了,动态绑定事件;自定义控件多了,就用了控件继承。但处理的结果并不理想,因为并不是每个操作员都喜欢用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>
7
protected 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![](/Images/OutliningIndicators/InBlock.gif)
27
//截停[Enter]消息
28
return true;
29
}
30
}
31![](/Images/OutliningIndicators/InBlock.gif)
32
//判断
33
// 按键是否为[Shift+Enter]
34
if (keyData == (Keys.Enter | Keys.Shift))
35
{
36
//成立执行
37
//模拟按下[Shift+Tab]
38
SendKeys.SendWait("+{Tab}");
39![](/Images/OutliningIndicators/InBlock.gif)
40
//截停[Shift+Enter]消息
41
return true;
42
}
43![](/Images/OutliningIndicators/InBlock.gif)
44
//非按下[Enter]继续处理
45
return base.ProcessCmdKey(ref msg, keyData);
46
}
47![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
2
![](/Images/OutliningIndicators/InBlock.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
30
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
47
![](/Images/OutliningIndicators/None.gif)