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

上传人:ni****g 文档编号:505364149 上传时间:2023-12-09 格式:DOCX 页数:4 大小:13.28KB
返回 下载 相关 举报
VC实现特定编辑框上对回车键响应_第1页
第1页 / 共4页
VC实现特定编辑框上对回车键响应_第2页
第2页 / 共4页
VC实现特定编辑框上对回车键响应_第3页
第3页 / 共4页
VC实现特定编辑框上对回车键响应_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《VC实现特定编辑框上对回车键响应》由会员分享,可在线阅读,更多相关《VC实现特定编辑框上对回车键响应(4页珍藏版)》请在金锄头文库上搜索。

1、摘要:本文讲述了在指定的编辑框上能响应从键盘输入回车键的一种方法,对进程内消息的 解析、动态获取指定资源ID等技术也作了简要描述。一、引言在通常的以CEd it View为基类的单文档/多文档视图程序中,可以很好的响应键盘输入 的回车键,只需比较最近两次的输入的字符,看看最新输入的字符是否内码是13(0x0d,回车 键的内码)即可识别出来,而要单独把一个编辑框放入对话框中却根本不响应,这个看似简 单的问题在实际应用中还是解决起来比较困难的。尤其是当一个充当表单录入的对话框上有 若干个编辑框,这就要求在一个编辑框添完一项表单后用习惯的回车键将该编辑框上的数据 读取到内存中去,并自动将光标移动到下

2、一个编辑框中准备填写下一栏表单。无疑这种界面 是十分人机友好的,使录入人员不必去执行每填一下表单就去按一下执行读入到缓存功能的 按钮的烦琐操作。但上述功能的实现却并不象其演示的功能那样简单,下面本文就对这项技 术的实现及附带的其他技术作简要的介绍。二、不能响应回车键的原因分析之所以在以CEd it View作为基类的程序中可以响应回车键,是由于该程序的视类本身就 是一个Edit控件,这就是问题的关键所在。CEditView作为CView的派生类能响应从键盘 输入的各种消息,其中有和键盘输入相关的WM_CHAR、WM_KEYDOWN、WM_KEYUP等消息。我们 就可以在这些消息的响应函数中灵活

3、地设计程序去捕捉到回车键的输入,并执行响应的操 作。当我们将编辑框作为一个普通的控件放到对话框上时情况就发生了变化。在此我们以 CFormView为例,它也是CView的一个派生类,视是一个Form窗体(即对话框),当放有编 辑框的窗体有回车键输入时,由于只有编辑框可以接受从键盘输入的字符,所以当键盘按下 时统统把消息都发给了编辑框(在Windows下每个窗口、按钮、编辑框都看作一个窗口,都 可以接受消息),可以通过ClassWizard在Object IDs选中编辑框所对应的ID号,在右边 的消息框中可以看出该编辑框并不能响应WM_CHAR等消息,只能用EN_CHANGE事件来做类似 的响应

4、。可当我们加入了对该事件的处理函数时,却又将回车键当作控制字符,当输入回车 键并不会激发EN_CHANGE事件,也就是说用这种方法仍旧无法捕获回车键的输入。三、拦截回车键的思路与方法Windows操作系统下各个窗口、控件归根结底都是通过系统的各种各样的消息来相互协 调、相互联系的,而我们所遇到的这个问题换到消息的角度说就是如何使程序能响应在编 辑框上输入的回车键所发出的消息,只要能响应到这个消息,剩下的工作都可以在消息处 理函数中完成。所以有必要对Windows系统的消息机制做些了解。每个Windows应用程序开始执行后Windows都为该程序创建一个消息队列(message queue),用

5、来存放邮寄给该程序可能创建的各种不同窗口的消息。消息队列中消息的结构 (MSG)为: typedef struct tagMSG/*msg*/HWND hwnd;/窗口句柄,标识接收消息的窗口。UINT message;/消息标识号,如 WM_TIMER 等。WPARAM wParam;/消息参数,当为键盘消息时,表示虚拟键码如VK_RETURN等。LPARAM lParam;/消息参数。DWORD t ime;/邮寄消息的时间。POINT pt;/邮寄消息时的光标位置,用屏幕坐标表示。MSG;在系统下最常用的消息循环是调用Get Message ()函数从消息队列中取出消息,然后调 用Des

6、patchMessage()函数让系统把消息发送给窗口函数,一般情况下其结果是把窗口的 所有消息都传送给窗口函数。但特殊情况下可以在GetMessage ()函数获得消息而又没发送 出去之前,通过TranslateMessage ()函数可以中途对消息进行解析,可以对指定的消息进 行拦截,拦截后即可以照样发送出去,也可以不继续发送,完成对该消息的拦截,下面代码 是该过程的示例:MSG msg;while(Ge tMessage( &msg,NULL,NULL,NULL,NULL)TranslateMessage(&msg);/对拦截的消息进行处理DispathchMessage(&msg);由

7、于按下回车键时把产生的消息加入到消息队列中了,也传给了编辑框,但仅仅是由于 编辑框没有能力处理该消息而造成了无法对回车键的响应,所以可以在消息循环里在把消息 发送到编辑框之前就对消息进行拦截,并对其进行处理。其效果同编辑框响应回车键是一样 的,仅在时序上有所提前而已。上述代码是在SDK (Software Develope Kits)下使用的, 在MFC(Microsoft Foundation Class)下早已对其进行了封装,可以通过重载虚函数 PreTransla teMessage()对所关心的消息进行解析:BOOL CTestView:PreTranslateMessage(MSG*

8、 pMsg)辻(WM_KEYFIRST = pMsg-message & pMsg-message message所表示的消息同WM_KEYFIRST和WM_KEYLAST比较,确定是键盘消息,然后通过消息参数pMsg-wParam的值来判断是否是回车键(VK_RETURN,虚拟键码可以从SDK相关资料查到)。如是,则可以将已输入到编辑框中的字 符读取到m_Text中,并将其显示出来。四、对编辑框的识别前面已经可以对回车键响应了,可一个表单窗体有若干个编辑框,其各自的处理方式不 尽相同,这就有必要对编辑框进行识别、对不同的编辑框做不同的处理。而且当按下回车键 时必须保证只有当前有焦点的编辑框能

9、完成对回车键的响应动作,否则也就失去了实际意 义。在Windows下的程序中,所有的资源都是有唯一标号的,使每个资源对象能唯一的区别 于其他资源,所以我们可以通过资源ID来对编辑框做出区别,使之完成各自的响应处理。 在 Microsoft Visual C+ 6.0下可以通过View菜单的ID二 Resource Symboles查到指 定ID的资源标识号的实际数值,如在本例中的两个编辑框IDC_EDIT1和IDC_EDIT2所对应的 数值分别为1000和1001,对前面的解析消息的代码做些改动,主要如下所示: f( pMsg-wParam=VK_RETURN )HWND hWnd二:GetF

10、ocus();int ilD二:GetDlgCtrllD(hWnd);if(iID=1000)/第一个编辑框的标识为1000UpdateData(TRUE);AfxMessageBox(m_Tex t1);/显示第一个编辑框的内容 if(iID=1001) /第二个编辑框的标识为1001UpdateData(TRUE);AfxMessageBox(m_Tex t2);/显示第二个编辑框的内容 在此通过API函数:Ge tF ocus()(注意前面的:,标识是全局API函数,而非某个类 中的成员函数)取得当前光标所处的(即有焦点的)编辑框的句柄,然后通过 API函 数:GetDlgCtrlID(

11、)根据这个句柄返回此窗口资源的ID号,该ID号是动态获取的,使之 同预先查看好的编辑框的ID作下比较即可区分出是需要哪个编辑框对回车键作出响应。小结:本文通过对消息的解析实现了对特定编辑框的回车键的响应,在对消息机制有了基本的 了解之后,可以用与本文类似的方法,对代码稍作改动,就可以使其他一些不能响应特殊消 息的控件能接收、处理特定的消息。注:以上方法可能处理的消息可能会响应两次,改成以下代码即可仅相应一次:BOOL CVesselDlg:PreTranslateMessage(MSG* pMsg)/* 判断消息类型*/f ( pMsg-message = WM_KEYDOWN & pMsg-wParam = VK_RETURN )/* 判断当前焦点是否在编辑框上*/HWND hWnd二:GetFocus();f ( :GetDlgCtrllD(hWnd) = IDC_SEARCHEDIT )/添加对消息处理的代码,做你想做的事情!return CWindow:IsDialogMessage(pMsg);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号