大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 特定的编辑框上实现对回车键的响应

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

时间: 2021-07-31 作者:daque

消息财产部电子第二十二接洽所青岛分所 郎锐 一、弁言 在常常的以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 <= pmsg->message && pmsg->message <= wm_keylast) { if(pmsg->wparam==vk_return ) { updatedata(true); afxmessagebox(m_text); } } return cformview::pretranslatemessage(pmsg); } 在上头的代码中,开始将pmsg->message所表白的动静同wm_keyfirst 和wm_keylast比拟,决定是键盘动静,而后经过动静参数pmsg->wparam的值来确定能否是回车键(vk_return,假造键码不妨从sdk关系材料查到)。如是,则不妨将已输出到编纂框中的字符读取到m_text中,并将其表露出来。 四、对编纂框的辨别 前方仍旧不妨对回车键相应了,可一个表单窗体有几何个编纂框,其各自的处置办法不尽沟通,这就有需要对编纂框举行辨别、对各别的编纂框做各别的处置。并且当按下回车键时必需保护惟有暂时有中心的编纂框能实行对回车键的相应举措,要不也就遗失了本质意旨。 在windows下的步调中,一切的资源都是有独一番号的,使每个资源东西能独一的辨别于其余资源,以是咱们不妨经过资源id来对编纂框做出辨别,使之实行各自的相应处置。在microsoft visual c++ 6.0下不妨经过"view"菜单的"id= resource symboles…"查到指定id的资源标识号的本质数值,如在本例中的两个编纂框idc_edit1和idc_edit2所对应的数值辨别为1000和1001,对前方的领会动静的代码做些变换,重要如次所示: …… if(pmsg->wparam==vk_return ) { hwnd hwnd=::getfocus(); int iid=::getdlgctrlid(hwnd); if(iid==1000)//第一个编纂框的标识为1000 { updatedata(true); afxmessagebox(m_text1);//表露第一个编纂框的实质 } if(iid==1001) //第二个编纂框的标识为1001 { updatedata(true); afxmessagebox(m_text2);//表露第二个编纂框的实质 } } …… 在此经过api因变量::getfocus()(提防前方的"::",标识是全部api因变量,而非某个类中的分子因变量)博得暂时光标所处的(即有中心的)编纂框的句柄,而后经过api因变量::getdlgctrlid()按照这个句柄归来此窗口资源的id 号,该id号是动静获得的,使之同预先察看好的编纂框的id作下比拟即可辨别出是须要哪个编纂框对回车键作出相应。 总结:正文经过对动静的领会实行了对一定编纂框的回车键的相应,在对动静体制有了基础的领会之后,不妨用与正文一致的本领,对代码稍作变换,就不妨使其余少许不许相应特出动静的控件能接受、处置一定的动静。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.