MFC控件Edit control限定输入字符 下载本文

内容发布更新时间 : 2024/6/16 4:40:21星期一 下面是文章的全部内容请认真阅读。

Edit control(静态编辑框)限定字符输入

实时输入(即对每一个输入字符进行判断,并显示符合要

求的字符,不符合要求的字符屏蔽)

找了好久好久,众口不一啊,感觉都没说到重点。鼓捣了两天,终于算是弄出来了。

先来说说:PreTranslateMessage是啥。

PreTranslateMessage消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当你需要在MFC之前处理某些消息时,常常要在这里添加代码。

MFC消息控制流最具特色的地方是CWnd类的虚拟函数

PreTranslateMessage(),通过重载这个函数,我们可以改变MFC的消息控制流程,甚至可以作一个全新的控制流出来。只有穿过消息队列的消息才受

PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在。

一、是否调用TranslateMessage()和DispatchMessage()是由一个名称为PreTranslateMessage()函数的返回值决定的,如果该函数返回TRUE,则不会把该消息分发给窗口函数处理。

二、传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。可以在该函数中使用(pMsg->wParam==VK_RETURN)来拦截回车键。

三、在WindowProc里不能处理WM_Char消息。 四、SetWindowText会发送WM_Char给窗口。 五、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的返回值,直接决定了输出,上面有详细说明(改变焦点(控件句柄)为主窗口,无论PreTranslateMessage返回值为啥,都不能在Edit control窗口中输出)。

经最后测试,WM_CHAR可以不用(其实也没发用),直接用PreTranslateMessage就可以了。

先判断WM_CHAN消息的产生,来获取按键值(可以用类向导生成一个函数,看一下其函数参数),接着判断焦点是否指向Edit control,再添加自己需要的内容就行,最后返回值,默认的是0,屏蔽的是1(PS:再次强调)

注:WM_CHAR消息和焦点判断必不可少。可根据需要自行嵌套。