• C#中方向键与回车键切换控件焦点


    环境:界面上有TextBox,ComboBox等控件。

    不建议把左右方向键都用来切换焦点,否则你在TextBox里面改变光标所在字符位置就不方便了。

    方法一:笨方法,需为每个控件单独注册事件处理

    以TextBox为例,代码如下:

     1 private void textbox_KeyDown(object sender, KeyEventArgs e)         
     2 {             
     3     if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Enter)             
     4     {                 
     5         e.SuppressKeyPress = true;                 
     6         System.Windows.Forms.SendKeys.Send("{Tab}");             
     7     }             
     8     else if (e.KeyCode == Keys.Up)             
     9     {                 
    10         e.SuppressKeyPress = true;                 
    11         System.Windows.Forms.SendKeys.Send("+{Tab}");             
    12     }         
    13 }

    方法二:简单方法,无需为每个控件单独注册事件处理,仅需在窗体类上加入如下代码:

     1 //上、下方向键,及回车键切换控件焦点
     2 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
     3 {
     4     Keys key = (keyData & Keys.KeyCode);
     5     if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Enter)             
     6     {                                  
     7       System.Windows.Forms.SendKeys.Send("{Tab}"); 
     8       return true;            
     9     }             
    10     else if (e.KeyCode == Keys.Up)             
    11     {                                  
    12       System.Windows.Forms.SendKeys.Send("+{Tab}");
    13       return true;             
    14     }   
    15     return base.ProcessCmdKey(ref msg, keyData);
    16 }

    到此,切换控件焦点的功能已实现,现在有个新的需求,窗体界面上有两个ComboBox控件cmbMeas和cmbRemark,我希望在这两个控件上Enter回车时提交,而不是切换焦点,那怎么办呢?那就需要判断当前拥有焦点的控件是不是cmbMeas或cmbRemark,上面的代码需要稍微改动下,具体代码如下:

     1 //API声明:获取当前焦点控件句柄      
     2 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
     3 internal static extern IntPtr GetFocus();
     4 
     5 //获取当前拥有焦点的控件
     6 private Control GetFocusedControl()
     7 {
     8      Control focusedControl = null;
     9      // To get hold of the focused control:
    10      IntPtr focusedHandle = GetFocus();
    11      if (focusedHandle != IntPtr.Zero)
    12          //focusedControl = Control.FromHandle(focusedHandle);
    13          focusedControl = Control.FromChildHandle(focusedHandle);
    14      return focusedControl ;
    15  }
    16 
    17 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    18 {
    19     Keys key = (keyData & Keys.KeyCode);
    20     Control ctrl = GetFocusedControl();
    21     if (e.KeyCode == Keys.Down || (key == Keys.Enter && ctrl.Name != "cmbMeas" && ctrl.Name != "cmbRemark"))             
    22     {                                  
    23         System.Windows.Forms.SendKeys.Send("{Tab}"); 
    24         return true;            
    25     }             
    26     else if (e.KeyCode == Keys.Up)             
    27     {                                  
    28         System.Windows.Forms.SendKeys.Send("+{Tab}");
    29         return true;             
    30     }   
    31     return base.ProcessCmdKey(ref msg, keyData);
    32 }

    说明:

    Control.FromHandle 方法

    返回当前与指定句柄关联的控件;如果找不到带有指定句柄的控件,就返回空引用。

    Control.FromChildHandle 方法

    如果需要返回拥有多个句柄的控件,应使用 FromChildHandle 方法。

    此方法沿着窗口句柄父级链向上搜索,直到找到与控件关联的句柄。此方法比 FromHandle 方法更可靠,因为它正确返回拥有多个句柄的控件。

    对于用户自定义控件,应当使用FromChildHandle 方法。

  • 相关阅读:
    Java根据百度API获得经纬度,然后根据经纬度在获得城市信息
    获取鼠标位置的几个通用的JS函数
    java 定时备份数据库
    基于commons-net实现ftp创建文件夹、上传、下载功能
    java自动识别用户上传的文本文件编码
    CSS3实现10种Loading效果
    Java实现拖拽上传
    JAVA 比较两张图片的相似度的代码
    Java jsp页面中jstl标签详解
    mysql去除重复数据
  • 原文地址:https://www.cnblogs.com/Scl891004X/p/6958427.html
Copyright © 2020-2023  润新知