- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Edit control (静态编辑框)限定字符输入
实时输入(即对每一个输入字符进行判断, 并显示符合要
求的字符,不符合要求的字符屏蔽)
找了好久好久,众口不一啊,感觉都没说到重点。鼓捣了两天,终于算是弄出来了。
先来说说:PreTranslateMessage 是啥。
PreTranslateMessage消息在送给TranslateMessage函数之前被调用的,绝 大多数本窗口的消息都要通过这里, 比较常用,当你需要在MFC之前处理某些消 息时,常常要在这里添加代码。
MFC消息控制流最具特色的地方是CWn(类的虚拟函数
PreTra nslateMessage。,通过重载这个函数,我们可以改变 MFC的消息控制流 程,甚至可以作一个全新的控制流出来。只有穿过 消息队列的消息才受
PreTranslateMessage。影响,采用SendMessage()或其他类似的方式向窗口直 接发送的而不经过消息队列的消息根本不会理睬 PreTranslateMessage。的存 在。
一、 是否调用 TranslateMessage()和 DispatchMessage()是由一个名称为 PreTranslateMessage。函数的返回值决定的,如果该函数返回 TRUE则不会把 该消息分发给窗口函数处理。
二、 传给PreTranslateMessage。的消息是未经翻译过的消息,它没有经过
TranslateMessage()处理。可以在该函数中使用(pMsg-wParam==VK_RETURN) 拦截回车键。 一
三、 在WindowProc里不能处理WM_Cha消息。
四、 SetWindowText 会发送 WM_Cha给窗口。
五、 PeekMessage和 GetMessage的区别: GetMessage在没有消息的时候等待消息,cpu占用率当然低。
PeekMessage没有消息的时候立刻返回,可以在没有消息的时候可以做其他处理, 但cpu占用率一般较高。
大多游戏都用PeekMessage();
再来说说WM_CHAR消息(注:WM_CHAR是类向导里面的消息)。
当键盘有一个键按下时,就会产生 WM_KEYDOWN —— WM_CHAR —— WM_KEYUP
三个消息。
其实WM_CHAR在焦点为主窗口下才能被调用。 也就是说,当你在Edit control中输入
文本时,其实指针是指向 Edit control的,此时执行的 WM_CHAR是默认的消息(或者应该 说:程序没有执行由类向导生成的 WM_CHAR消息产生的自定义函数里的程序)。
有人说可以通过PreTranslateMessage来让指针指向主窗口,那样 WM_CHAR消息将被
调用。但是,那样你又怎能在 Edit control显示响应的值?因为,第一: WM_CHAR是无返
回值(此时,你不能让焦点重新指向 Edit control,就不能对其输出值。 PS:高手例外,不讨
论重新编写焦点指向问题),第二:PreTranslateMessage的返回值,直接决定了输出,上面 有详细说明(改变焦点(控件句柄)为主窗口,无论 PreTra nslateMessage返回值为啥,都不
能在Edit control窗口中输出)。
经最后测试, WM_CHAR 可以不用(其实也没发用) ,直接用 PreTranslateMessage 就可 以了。
先判断 WM_CHAN 消息的产生,来获取按键值(可以用类向导生成一个函数,看一下 其函数参数) ,接着判断焦点是否指向 Edit control ,再添加自己需要的内容就行,最后返回 值,默认的是0,屏蔽的是1( PS:再次强调)
注: WM_CHAR 消息和焦点判断必不可少。可根据需要自行嵌套。
文档评论(0)