用VC实现特定编辑框上对回车键响应
Posted on 八月 16rd, 2007 由 admin
热门问答:
推荐阅读
| · 拍照手机的小技巧,用来检测红外遥控器 |
| 摘要: 现在我们的家用电器使用的遥控器大部分是红外遥控器,其红外发射光我们肉眼是看不见的,对于正确判断是接收设备还是遥控器的故障是十分重要的,会让我们少走很多的弯路,以前检修是我一般用收音机估判遥控器的好坏,现在用手机则非常直观,方便,方法如下: 将手机拍照或摄影打开,将遥控器发射部位对着手机镜头,按遥控器任一个键,在手机显示屏应能看到遥控器发出白色的光,若没...... |
| · 博科帮助德国gehring建分层文件存储环境 服务器存储频道 |
| 摘要: 2007年2月27日,北京――博科公司(brocade)宣布德国知名珩磨机和精密机械工具制造商gehring集团采用博科fan软件解决方案,更高效地管理其基于文件的数据环境。博科文件生命周期管理器(brocadefilelifecyclemanager)帮助gehring集团为当前的networkappliance文件数据存储系统创建分层存储体系架构,从而极大地简化了文件数据管理,并在提高效率的同时降低成本。gehring集团it负责人k...... |
正文
摘要:本文讲述了在指定的编辑框上能响应从键盘输入回车键的一种方法,对进程内消息的解析、动态获取指定资源id等技术也作了简要描述。
关键字:microsoft visual c++ 6.0、编辑框、回车键、消息、资源
一、引言
在通常的以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)为:
在系统下最常用的消息循环是调用getmessage()函数从消息队列中取出消息,然后调用despatchmessage() 函数让系统把消息发送给窗口函数,一般情况下其结果是把窗口的所有消息都传送给窗口函数。但特殊情况下可以在getmessage()函数获得消息而又没发送出去之前,通过translatemessage()函数可以中途对消息进行解析,可以对指定的消息进行拦截,拦截后即可以照样发送出去,也可以不继续发送,完成对该消息的拦截,下面代码是该过程的示例:
由于按下回车键时把产生的消息加入到消息队列中了,也传给了编辑框,但仅仅是由于编辑框没有能力处理该消息而造成了无法对回车键的响应,所以可以在消息循环里在把消息发送到编辑框之前就对消息进行拦截,并对其进行处理。其效果同编辑框响应回车键是一样的,仅在时序上有所提前而已。上述代码是在sdk(software develope kits)下使用的,在mfc(microsoft foundation class)下早已对其进行了封装,可以通过重载虚函数pretranslatemessage()对所关心的消息进行解析:
在上面的代码中,首先将pmsg->message所表示的消息同wm_keyfirst 和wm_keylast比较,确定是键盘消息,然后通过消息参数pmsg->wparam的值来判断是否是回车键(vk_return,虚拟键码可以从sdk相关资料查到)。如是,则可以将已输入到编辑框中的字符读取到m_text中,并将其显示出来。


讨论区