按回车跳转窗体焦点

"按回车跳转窗体焦点?"

回想几年前我写程序的时候,第一次碰到这个需求。每个界面上的控件都写了一次编码;后来控件多了,动态绑定事件;自定义控件多了,就用了控件继承。但处理的结果并不理想,因为并不是每个操作员都喜欢用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

posted @ 2008-03-08 18:45  王伟晔  阅读(1312)  评论(1编辑  收藏  举报