用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://hcq11.blogbus.com/logs/54217707.html

近日在为一个数据应用写数据输入界面,大量的编辑框要想实现快速的输入就是有设计良好的符合工作流程的TAB键序。相信,不少的人在使用具有大量编辑框的程序时都有这样的想法和感概。而我这个对话框界面主要输入的是数字,因此如果使用TAB键作编辑框之间的跳转会在使用数字键盘时不方便。因此,就考虑了用回车键来实现TAB键的功能。因为MFC对话框的特点,基于MFC对话框的对话框按下回车键会调用框架内的的OnOk成员函数导至退出。即使你去掉IDC_OK按键的BS_DEFPUSHBUTTON 属性也是不行的。
必须重载WM_GETDEFID,因为当用户按下回车键时,Windows发送WM_GETDEFID消息来获得缺省的命令ID,Windows再将它作为WM_COMMAND发送,所以重载这个消息必须在高位字中返回DC_HASDEFID。 如下所例:

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    ON_MESSAGE(DM_GETDEFID, OnGetDefID)
    ...
END_MESSAGE_MAP()

LRESULT CMyDlg::OnGetDefID(WPARAM wp, LPARAM lp)
{
    return MAKELONG(0,DC_HASDEFID);
}
        这是一种方法,另外一种方法是在消息循环处着手处理。重载PreTranslateMessage这个虚函数,将消息队列中有关键盘按下的消息给拦载下来,在框架之前处理WM_KEYDOWN消息。判断是按下回车键后,我们可以用GetNextDlgTabItem 函数获得TAB键序中下一个或上一个接受TAB键的控件句柄。示例代码如下:
BOOL CKeydownDlg::PreTranslateMessage(MSG* pMsg)
{
     if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
     {
           CWnd *mwnd = GetNextDlgTabItem (GetFocus());        //取得当前焦点控件的下一个控件的句柄
           if (mwnd)
           {
                mwnd->SetFocus();        //设置下一件控件得到输入焦点
                return TRUE;
           }
     }
   return CDialog::PreTranslateMessage(pMsg);
}
        但是,各位有没有注意到。这样处理之后,虽然可以在各个控件之进行输入焦点的转移。可是当一个按钮控件获得了焦点之后,也是按下回车键。以前我们习惯中或者说预料中按下该按钮的后应该执行的功能没有被执行,而焦点又跑到按钮之后的控件上去了。这就是上面代码的不足之处,虽然实现了焦点由回车键控件转移,但是按钮却不能用回车键来操作了。只以用鼠标,这和大家习惯不合。而且,在快速的数据输入中不能用回车键来按下这个按钮却要用鼠标来点击也有违当初我们要快速这样一个目的。所以,还得对以上代码做适当的修改。代码如下。
        在这里增加了对当前焦点控件类的判断,即如果当前控件是按钮(Button)那么就不执行焦点跳转而是构造一条WM_COMMAND消息发送给程序,让程序以为是鼠标点击了该按钮。从而执行了这个按钮具有的功能而不是什么也不做的焦点转移。

BOOL CKeydownDlg::PreTranslateMessage(MSG* pMsg)
{
      if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
      {
          CWnd *wnd = GetFocus ();
          if (wnd != NULL)
          {
               char str[256];
               CString ClassName = _T("Button");
               GetClassName (wnd->m_hWnd, str, 256);
                 if (ClassName == str)
                 {
                        UINT i = wnd->GetDlgCtrlID ();
                        SendMessage (WM_COMMAND, i, (LPARAM)wnd->m_hWnd);
                        return TRUE;
                   }
         }
      CWnd *mwnd = GetNextDlgTabItem (wnd);
      if (mwnd)
      {
            mwnd->SetFocus();
           return TRUE;
       }
}

return CDialog::PreTranslateMessage(pMsg);
}

TAB ORDER按回车键使下个控件自动获得焦点

1.选中主对话框:Layout菜单=>Tab Order(或者直接按Ctrl+D):按你需要的TAB顺序依次单击控件.

2.按Ctrl+W打开MFC ClassWizard=>Message Maps选项卡:给你的主DLG映射PreTranslateMessage消息处理函数:
BOOL CYourDlg::PreTranslateMessage(MSG* pMsg)
{
    // 顺次传递焦点,除非当前焦点在确定按钮上时才响应触发消息
    if((pMsg->message == WM_KEYDOWN) && (VK_RETURN == (int) pMsg->wParam))
    {
        if(GetFocus()->GetDlgCtrlID() != IDOK)
        {
            pMsg->wParam = VK_TAB;
        }
    }

return CDialog::PreTranslateMessage(pMsg);
}

用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)相关推荐

  1. 在VNC中Xfce4中Tab键失效的解决方法

    博客新址: http://blog.xuezhisd.top 邮箱:xuezhisd@126.com 说明 在Ubuntu Server 14.04上安装了xfce4桌面环境,但是却发现***在终端中 ...

  2. vim中tab键8空格换4空格

    前言 很多时候,都看不惯vim中tab键8个空格,觉得这个空格实在是太长了,浪费屏幕,那么现在就让你解决掉8个tab键8个空格,换成4个空格. 具体步骤 打开文件:/etc/vimrc vim /et ...

  3. 远程桌面中Tab键不能补全的解决办法

    我们曾在之前的一篇文章中介绍了windows远程连接ubuntu的方法,在成功登陆远程桌面环境之后,发现在终端中Tab键不能自动补齐(但是Ctrl +Tab 可以用,但是需要按下组合键才能补全的话,时 ...

  4. 在VNC远程桌面环境Xfce4中Tab键失效的解决方法

    配置vnc远程桌面环境xfce4见下文 windows vnc 远程登录 ubuntu Linux 系统 在成功登陆xfce4远程桌面环境之后发现在终端中Tab键不能自动补齐.问题的原因是由于Tab键 ...

  5. python tab键自动补全_设置python中TAB键自动补全方法

    设置python中TAB键自动补全方法 一.创建自动补全脚本如下: vi /tmp/python/tab.py #!/usr/bin/python # python tab file import s ...

  6. python中tab键_python中tab键是什么意思

    对于程序员来说,其实Tab和空格远远不只是"立场"问题那么简单. 在不同的编辑器里tab的长度可能不一致,所以在一个编辑器里用tab设置缩进后,在其它编辑器里看可能缩进就乱了.空格 ...

  7. python tab键_python中tab键是什么意思

    对于程序员来说,其实Tab和空格远远不只是"立场"问题那么简单. 在不同的编辑器里tab的长度可能不一致,所以在一个编辑器里用tab设置缩进后,在其它编辑器里看可能缩进就乱了.空格 ...

  8. linux远程桌面键盘无法输入,windows远程桌面ubuntu中Tab键不能补全命令的解决办法...

    windows远程桌面ubuntu中Tab键不能补全命令的解决办法 前置 window可以远程ubuntu的前提 参考百度经验即可实现:windows远程桌面ubuntu 正文 在成功登陆远程桌面环境 ...

  9. 记事本中TAB键替换为空格键的方法

    转载自:http://blog.sina.com.cn/s/blog_6ce5d9fb0101hxkt.html 工作中需要将一些TAB键转换为空格键,需要的步骤如下: 原始数据如 01025    ...

最新文章

  1. 一个关于小程序Iot的具体实现(MQTT版)
  2. Sqli-labs less 62
  3. shell-sed脚本
  4. python pip国内源_【Python】设置pip源为国内源及简单操作
  5. 11-直接内存 Direct Memory
  6. Linux中的mysql.redis
  7. web性能优化(理论)
  8. java substring截取字符串_lt;12gt;深入了解字符串
  9. linux 中断 进程,linux中断分上下部分原因
  10. C语言插件开发模式与分析
  11. Tensorflow使用教训:被tf.image.resize浪费的60天
  12. redis缓存和mysql数据库同步
  13. mysql数据库原理及应用实训报告_《数据库原理及应用》实验报告.doc
  14. c语言车牌号5位数,为何有的车牌是五位数字,有的加英文字母?终于知道原因了!...
  15. vmware,qemu各种方式上网设置(转)
  16. 训练集、测试集和验证集的作用
  17. VueDemo-12.加入购物车
  18. 华为云ecs服务器镜像上传到容器镜像服务SWR
  19. Windows Phone 7 EKB系列文章发布
  20. 银监会出贷后管理新规 防资金空转

热门文章

  1. pat 乙级 1028 人口普查(C++)
  2. 光纤收发器和协议转换器之间有哪些区别?
  3. 【渝粤教育】国家开放大学2018年春季 3780-21T燃气设备操作与维护 参考试题
  4. 【渝粤题库】陕西师范大学202311金融机构管理Ⅰ作业(高起专)
  5. httpurlconnect设置中文参数_数控三菱CNC机床参数的设置及报警解除!
  6. Linux 实现网页劫持,Linux下实现劫持系统调用的总结(上)--代码及实现
  7. 富贵不压重发_为什么老人常说“贵人不顶重发”,“重发”是什么意思? ?...
  8. 空指针异常NullPointerException解决
  9. Java基本语法(8)--比较运算符
  10. NOIP模拟测试28「阴阳·虎·山洞」