`
ukn660dm
  • 浏览: 15351 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

vc(mfc) 用VC实现特定编辑框上对回车键响应

阅读更多

vc(mfc) 用VC实现特定编辑框上对回车键响应
2010年06月03日
  
      在通常的以CEditView为基类的单文档/多文档视图程序中,可以很好的响应键盘输入的回车键,只需比较最近两次的输入的字符,看看最新输入的字符是 否内码是13(0x0d,回车键的内码)即可识别出来,而要单独把一个编辑框放入对话框中却根本不响应,这个看似简单的问题在实际应用中还是解决起来比较 困难的。尤其是当一个充当表单录入的对话框上有若干个编辑框,这就要求在一个编辑框添完一项表单后用习惯的回车键将该编辑框上的数据读取到内存中去,并自 动将光标移动到下一个编辑框中准备填写下一栏表单。无疑这种界面是十分人机友好的,使录入人员不必去执行每填一下表单就去按一下执行读入到缓存功能的按钮 的烦琐操作。但上述功能的实现却并不象其演示的功能那样简单,下面本文就对这项技术的实现及附带的其他技术作简要的介绍。
  二、不能响应回车键的原因分析
  之所以在以CEditView作为基类的程序中可以响应回车键,是由于该程序的视类本身就是一个Edit控件,这就是问题的关键所在。 CEditView作为CView的派生类能响应从键盘输入的各种消息,其中有和键盘输入相关的WM_CHAR、WM_KEYDOWN、WM_KEYUP 等消息。我们就可以在这些消息的响应函数中灵活地设计程序去捕捉到回车键的输入,并执行响应的操作。
  当我们将编辑框作为一个普通的控 件放到对话框上时情况就发生了变化。在此我们以CFormView为例,它也是CView的一个派生类,视是一个Form窗体(即对话框),当放有编辑框 的窗体有回车键输入时,由于只有编辑框可以接受从键盘输入的字符,所以当键盘按下时统统把消息都发给了编辑框(在Windows下每个窗口、按钮、编辑框 都看作一个窗口,都可以接受消息),可以通过ClassWizard在"Object IDs"选中编辑框所对应的ID号,在右边的消息框中可以看出该编辑框并不能响应WM_CHAR等消息,只能用EN_CHANGE事件来做类似的响应。可 当我们加入了对该事件的处理函数时,却又将回车键当作控制字符,当输入回车键并不会激发EN_CHANGE事件,也就是说用这种方法仍旧无法捕获回车键的 输入。
  三、拦截回车键的思路与方法
  

  Windows操作系统下各个窗口、控件 归根结底都是通过系统的各种各样的消息来相互协调、相互联系的,而我们所遇到的这个问题换到消息的角度说就是"如何使程序能响应在编辑框上输入的回车键所 发出的消息",只要能响应到这个消息,剩下的工作都可以在消息处理函数中完成。所以有必要对Windows系统的消息机制做些了解。
  每个Windows应用程序开始执行后,Windows都为该程序创建一个"消息队列(message queue)",用来存放邮寄给该程序可能创建的各种不同窗口的消息。消息队列中消息的结构(MSG)为:
  typedef struct tagMSG{
  /*msg*/
  HWND hwnd;//窗口句柄,标识接收消息的窗口。
  UINT message;//消息标识号,如WM_TIMER等。
  WPARAM wParam;//消息参数,当为键盘消息时,表示虚拟键码如VK_RETURN等。
  LPARAM lParam;//消息参数。
  DWORD time;//邮寄消息的时间。
  POINT pt;//邮寄消息时的光标位置,用屏幕坐标表示。
  }MSG;
  在系统下最常用的消息循环是调用GetMessage()函数从消息队列中取出消息,然后调用DespatchMessage() 函数让系统把消息发送给窗口函数,一般情况下其结果是把窗口的所有消息都传送给窗口函数。但特殊情况下可以在GetMessage()函数获得消息而又没 发送出去之前,通过TranslateMessage()函数可以中途对消息进行解析,可以对指定的消息进行拦截,拦截后即可以照样发送出去,也可以不继 续发送,完成对该消息的拦截,下面代码是该过程的示例:
  MSG msg;
  while(GetMessage(&msg,NULL,NULL,NULL,NULL){
  TranslateMessage(&msg);
  …… //对拦截的消息进行处理
  DispathchMessage(&msg);
  }
  由于按下回车键时把产生的消息加入到消息队列中了,也传给了编辑框,但仅仅是由于编辑框没有能力处理该消息而造成了无法对回车键的响应,所以可以在消息 循环里在把消息发送到编辑框之前就对消息进行拦截,并对其进行处理。其效果同编辑框响应回车键是一样的,仅在时序上有所提前而已。上述代码是在 SDK(Software Develope Kits)下使用的,在MFC(Microsoft Foundation Class)下早已对其进行了封装,可以通过重载虚函数PreTranslateMessage()对所关心的消息进行解析:
  BOOL CTestView::PreTranslateMessage(MSG* pMsg)
  {
  if (WM_KEYFIRST message && pMsg->message wParam==VK_RETURN )
  {
  UpdateData(TRUE);
  AfxMessageBox("hh");
  }
  }
  return CFormView::PreTranslateMessage(pMsg);
  }
  在上面的代码中,首先将pMsg->message所表示的消息同WM_KEYFIRST 和WM_KEYLAST比较,确定是键盘消息,然后通过消息参数pMsg->wParam的值来判断是否是回车键(VK_RETURN,虚拟键码可 以从SDK相关资料查到)。如是,可以显示jj字符。这里可以加响应的操作,如QQ中发送消息不仅可用enter键,也可按发送按钮等等。
分享到:
评论

相关推荐

    VC实现特定编辑框上对回车键响应

    VC实现特定编辑框上对回车键响应,介绍的挺详细!

    VC动态创建Edit,Edit响应回车按键时自动销毁!

    详细描述见我的博客:http://blog.csdn.net/qq_23992597/article/details/53214215

    VC 按回车键智能切换到下一个输入框焦点.rar

    VC 按回车键智能切换到下一个输入框焦点,其实是将按键为ENTER的WM_KEYDOWN消息转换成按键为TAB的消息。这个小功能会给用户的输入带来很大的便利,特别是开发一些具有用户界面、人机对话录入的界面中,更适合使用本...

    Z缓冲消除隐藏面算法(源码及演示程序) VC6.0MFC 编写

    完整实现了一个MFC版的Z缓冲消隐算法,程序实现了一个六色立方体的显示。 注:可以通过键盘上的上下左右键进行X、Y轴的旋转,通过回车键可以更新立方体,而AWSD各键为平移。。。。。。

    按回车键依次移动光标到下一个文本框

    MFC vc6.0编译环境 按回车键依次移动光标到下一个文本框,并附有文档说明关键步骤

    在VC++的对话框中定制回车键

    内容索引:VC/C++源码,系统相关,回车,对话框 本程序告诉你如何改变对话框中回车键的行为,并为对话框实现加速键。在不少程序中,我们点回车键要么代表确认要么是程序退出,好像是系统默认的动作,这实际挺烦人,那么...

    VC++常用功能实例

    问:VC6.0对VC5.0的兼容性? 64 问:打印和打印机的问题? 64 问:CRichEditCtrl滚动条的问题? 65 问:从数据库中读大于32k的内容? 65 问:如何获得CRichEditCtrl中字符的位置? 66 问:如何限制mdi子框架最大化时的...

    如何定制对话框中的回车键

    如何定制对话框中的回车键!!!!

    如何定制对话框中的回车键VC源代码

    基于对话框的程序中,每次按下回车键时,程序都退出。那么如何定制回车键的行为呢? 这个问题在Windows的开发中由来已久,对于初学者来说,这是个恼人的问题,幸运的是,人们找到了多种解决这个问题的方案。此代码...

    VC++.NET使用回车键切换输入焦点

    摘要:VC/C++源码,系统相关,回车键,切换焦点 VC++.NET使用回车键切换输入焦点,估计这功能不用多描述了吧,用户在输入框输入内容的时候,当输入完毕,只需点一下回车键,输入光标就会自动跳转至下一个需要输入内容的...

    VC++常用的共用函数100多页

    问:VC6.0对VC5.0的兼容性? 64 问:打印和打印机的问题? 64 问:CRichEditCtrl滚动条的问题? 65 问:从数据库中读大于32k的内容? 65 问:如何获得CRichEditCtrl中字符的位置? 66 问:如何限制mdi子框架最大化时的...

    砸石头游戏

    一个横版过关游戏,人物带动作,P1的W、S、A、D分别...攻击可蓄力,跳跃也有力度的区别,敌人带AI,回车键换背景,还没有关卡。 VC6.0,先运行Debug文件夹内的exe文件看看效果,再打开工程点击“组建”->“全部重建”。

    VC++屏蔽对话框按ESC或ENTER键退出

    VC/C++源码,界面编程,对话框 VC++如何屏蔽窗体对话框按ESC或ENTER键退出的功能,也就是说,当窗体打开的时候,按ESC或ENTER键不能关闭窗口,也就是让这两个键失效,源码实例运行截图如上所示,不过从截图上似乎看...

    代码语法错误分析工具pclint8.0

    本文主要对pclint集成到VC及SourceInsight环境中的方法根据本人安装和使用心得做了较详细介绍,希望对以前没使用过pclint的朋友们能有所帮助,不足之处还请多指正! PC-Lint使用简介 用开发环境进行LINT也可以...

    C#微软培训资料

    <<page 1>> page begin==================== 目 目目 目 录 录录 ... 2000 年 6 月 22 日 不论对 Microsoft 还是对整个 IT 业界都将成为值得纪念的一天 这一天 微软公司正式推出了其下一代...

    Radmin自动登录器v3.0-多国语言绿色版-Release1-20150615

    为了在功能和稳定性方面进一步提高和改进,v2.0版使用VC++ Unicode(MFC)编程,程序在编译时已经集成了VC运行库,可独立运行。 由于MFC越益臃肿笨重,为了提高稳定性和效率,v3.0版使用WTL VC++ Unicode编程,程序...

    Radmin自动登录器v3.0

    为了在功能和稳定性方面进一步提高和改进,v2.0版使用VC++ Unicode(MFC)编程,程序在编译时已经集成了VC运行库,可独立运行。 由于MFC越益臃肿笨重,为了提高稳定性和效率,v3.0版使用WTL VC++ Unicode编程,程序...

Global site tag (gtag.js) - Google Analytics