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

原创 2004年10月20日 20:27:00

          近日在为一个数据应用写数据输入界面,大量的编辑框要想实现快速的输入就是有设计良好的符合工作流程的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);
}

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

用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果
  • eickandy
  • eickandy
  • 2015年10月29日 10:19
  • 1611

MFC对话框中按TAB键 实现在指定控件中跳转

MFC对话框中按TAB键 实现在指定控件中跳转
  • zt_xcyk
  • zt_xcyk
  • 2017年03月15日 14:37
  • 446

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

用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转) 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://hcq11.blogbus.co...
  • keti_xuetangyi
  • keti_xuetangyi
  • 2013年03月14日 10:40
  • 632

VC MFC 子窗口内部和外部的控件焦点用Tab键区切换

要想实现这个功能, 要在对话框资源里的Control这个属性设置为True
  • brook0344
  • brook0344
  • 2015年01月29日 23:37
  • 1495

mfc 改变tab快捷键对控件的顺序

 关于改变Tab顺序的方法有以下几种: 方法一: 在动态创建控件的时候STYLE设置成为WS_CHILD|WS_VISIBLE|WS_TABSTOP,其中WS_TABSTOP是影响TAB顺序...
  • wangdong770909027
  • wangdong770909027
  • 2015年08月21日 14:03
  • 1196

Tab Control——属性页的子对话框中的CEdit控件无法输入的解决办法

问题描述CEdit控件在Tab页中没办法输入,利用TabSheet类进行解决
  • xuanyuanlei1020
  • xuanyuanlei1020
  • 2016年09月13日 10:39
  • 674

tab键控制元素跳转

tab键大部分时候用于html页面在可以输入框, 链接, 按钮的跳转,    关于如何控制元素间的跳转顺序和忽略某些元素不进行跳转。    默认情况下,tab键按照页面上相关元素出现的顺序进行跳转...
  • sunhuwh
  • sunhuwh
  • 2013年10月30日 11:38
  • 1555

MFC对话框窗口&Tab Control控件

在工具箱向面板添加Tab Control后 需要注意Tab Control分为标签和客户区两个区域 标签就是一堆按钮,切换时触发事件 分别添加标签、客户区、针对标签的消息响应函数,达到使用标签切换窗口...
  • crf_moonlight
  • crf_moonlight
  • 2017年05月10日 19:54
  • 255

MFC对话框使用回车键实现像TAB键一样跳转输入焦点

在一个MFC界面中完成大量散乱数据的输入操作,包含很多的EDIT控件。当使用数字键输入时,用TAB进行焦点控制颇为不便,考虑使用回车键。具体分两步实现:1、将各控件的TAB顺序调整好。使用Ctrl+D...
  • hfutljx
  • hfutljx
  • 2017年04月26日 20:39
  • 327

DLL/OCX中的MFC对话框不能处理Tab和回车键的问题

原文发表在[http://community.csdn.net/expert/Topicview2.asp?id=3072485] 带子窗口的ActiveX控件问题,如何获取回车键? 问题: 新建一...
  • jiangsheng
  • jiangsheng
  • 2004年07月11日 20:49
  • 10750
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用回车键实现MFC对话框中TAB键控制输入焦点在控件中跳转的效果
举报原因:
原因补充:

(最多只允许输入30个字)