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

用回车键实现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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-面向对象编程设计与开发

编程范式 1、对不同类型的任务,所采取不同的解决问题的思路。 2、编程范式有两种 1、面向过程编程 2、面向对象编程 面向过程编程 什么是面向过程编程? 过程——解决问题的步骤 要解决一个大的问题 1、先把大问题拆分成若干小问题或子过程。 2、然后子过…

MFC下列表控件的使用

MFC下列表控件的使用 2012-11-09 16:46:57| 分类&#xff1a; 程序VC相关 | 标签&#xff1a; |字号大中小 订阅 1、应该加入头文件 #include <Atlbase.h>2、示例m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE);m_lis…

jbehave_使用JBehave,Gradle和Jenkins的行为驱动开发(BDD)

jbehave行为驱动开发 &#xff08;BDD&#xff09;是一个协作过程 &#xff0c;产品所有者&#xff0c;开发人员和测试人员可以合作交付可为业务带来价值的软件。 BDD是 测试驱动开发 &#xff08;TDD&#xff09; 的合理下一步 。 行为驱动的发展 本质上&#xff0c;BDD是一…

Confluence 6 考虑使用自定义 CSS

CSS 的知识储备 如果你没有有关 CSS 的相关知识&#xff0c;请参考页面 CSS Resources section 中的内容。当你打算开始对 Confluence 的样式表进行修改之前&#xff0c;你应该对 CSS 有一些相关的了解和知识储备。 安全 自定义 CSS 有可能被在页面中注入脚本&#xff0c;有跨…

MFC--CColorDialog的使用

MFC--CColorDialog的使用 2012-05-07 11:05:32| 分类&#xff1a; 学习mfc/c | 标签&#xff1a; |字号大中小 订阅 要在类中定义一个存储颜色的变量COLORREF m_color; 创建一个按钮&#xff0c;用来调用CColorDialog&#xff0c;用以改变静态文本的颜色&#xff0c;&a…

嵌入式 开发——DMA内存到外设

学习目标 加强理解DMA数据传输过程加强掌握DMA的初始化流程掌握DMA数据表查询理解源和目标的配置理解数据传输特点能够动态配置源数据学习内容 需求 串口发送数据 uint8_t data = 0x01; 串口发送(data); 实现串口的发送数据, 要求采用dma的方式 数据交互流程 CPU配置好DM…

使用Java第2部分查询DynamoDB项

在上一篇文章中&#xff0c;我们有机会发布了一些基本的DynamoDB查询操作。 但是&#xff0c;除了基本操作之外&#xff0c;DynamoDB api还为我们提供了一些额外的功能。 投影是具有类似选择功能的功能。 您选择应从DynamoDB项中提取哪些属性。 请记住&#xff0c;使用投影不…

XSS

1.什么是xss XSS攻击全称跨站脚本攻击&#xff0c;是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩写为XSS&#xff0c;XSS是一种在web应用中的计算机安全漏洞&#xff0c;它允许恶意web用户将代码植入到提供给其它用户使用的页面中…

C++中引用传递与指针传递区别(进一步整理)

C中引用传递与指针传递区别&#xff08;进一步整理&#xff09; 博客分类&#xff1a; C/C CCC#J# 从概念上讲。指针从本质上讲就是存放变量地址的一个变量&#xff0c;在逻辑上是独立的&#xff0c;它可以被改变&#xff0c;包括其所指向的地址的改变和其指向的地址中所存放的…

Python之匿名函数

一、匿名函数&#xff1a;也叫lambda表达式 1.匿名函数的核心&#xff1a;一些简单的需要用函数去解决的问题&#xff0c;匿名函数的函数体只有一行 2.参数可以有多个&#xff0c;用逗号隔开 3.返回值和正常的函数一样可以是任意的数据类型 二、匿名函数练习 请把下面的函数转换…

C++中const用法总结

C中const用法总结 Posted on 2009-04-21 22:55 月光林地 阅读(7821) 评论(2) 编辑 收藏 1. const修饰普通变量和指针 const修饰变量&#xff0c;一般有两种写法&#xff1a; const TYPE value; TYPE const value; 这两种写法在本质上是一样的。它的含义是&#xff1a;const修…

vaadin_5分钟内Google App Engine上的Vaadin App

vaadin在本教程中&#xff0c;您将学习如何创建第一个Vaadin Web应用程序&#xff0c;如何在本地AppEngine开发服务器上运行它以及如何将其部署到Google App Engine基础结构。 所有这些大约需要5到10分钟。 是的&#xff0c;如果您已经安装了必要的先决条件&#xff0c;则可以立…

【Java深入研究】10、红黑树

一、红黑树介绍 红黑树是二叉查找树&#xff0c;红黑树的时间复杂度为: O(lgn) 红黑树的特性&#xff1a;&#xff08;1&#xff09;每个节点或者是黑色&#xff0c;或者是红色。&#xff08;2&#xff09;根节点是黑色。&#xff08;3&#xff09;每个叶子节点&#xff08;NIL…

MATLAB排序函数

MATLAB排序函数 (2011-06-29 13:02:08) 源自网络 sort(A)若A是向量不管是列还是行向量&#xff0c;默认都是对A进行升序排列。sort(A)是默认的升序&#xff0c;而sort(A,descend)是降序排序。 sort(A)若A是矩阵&#xff0c;默认对A的各列进行升序排列 sort(A,dim) dim1时等效s…

【分形】【洛谷P1498】

https://www.luogu.org/problemnew/show/P1498 题目描述 自从到了南蛮之地&#xff0c;孔明不仅把孟获收拾的服服帖帖&#xff0c;而且还发现了不少少数民族的智慧&#xff0c;他发现少数民族的图腾往往有着一种分形的效果&#xff0c;在得到了酋长的传授后&#xff0c;孔明掌握…

Java认证:认证或不认证

专业认证始终是一个有争议的主题&#xff0c;有资格的人在争论收益与成本/时间之间的关系。 通过Oracle的Java认证&#xff0c;我认为有两个主要的受众可以从中受益&#xff1a; 那些开始从事软件事业的人。 扎实的工作经验和可证明的代码将永远是潜在雇主的首要考虑因素。 但…

linux下杀死进程全权讲解

linux下杀死进程全权讲解 2009-10-27 08:57 佚名 linux 我要评论(0) 字号&#xff1a;T | T本文将详细讲解linux杀死进程的多种命令&#xff0c;包含他们的作用&#xff0c;kill作用&#xff1a;根据进程号杀死进程&#xff1b; killall作用&#xff1a;通过程序的名字&#xf…

python学习笔记(10)--组合数据类型(序列类型)

序列是具有先后关系的一组数据&#xff0c;是一维元素向量&#xff0c;元素类型可以不同&#xff0c;类似数学元素序列&#xff0c;元素间由序号引导&#xff0c;通过下标访问序列的特定元素。序列类型是一个基类类型&#xff0c;字符串类型&#xff0c;元祖类型&#xff0c;列…

Java Process中waitFor()的问题

Java Process中waitFor()的问题 http://yearsaaaa123789.iteye.com/blog/1404865在编写Java程序时&#xff0c;有时候我们需要调用其他的诸如exe,shell这样的程序或脚本。在Java中提供了两种方法来启动其他程序&#xff1a;(1) 使用Runtime的exec()方法(2) 使用ProcessBuilder…

java jsr_Java EE 7中包含哪些JSR?

java jsr我开始填写所有应该包含在Java EE 7中的Java规范请求的表。 由于仍在决定平台版本&#xff0c;因此某些细节很难确定。 完整的Java EE 7 EJB产品具有以下标准组件和API&#xff1a; 名称 版 描述 JSR 网页 个人资料 批处理 1.0 批量处理 352 Bean验证 1…