标签:
一、涉及编写自己的自己的键盘
由于只使用英文字母跟数字等简单的字符而已,没有包括全角或者中文字符。所以直接使用跟手机的输入密码键盘一样的键盘即可。
遇到的问题:1、使用法keybd_event()的方式进行发送消息,不管发送大小写字母都是显示小写字母
2、键盘不能有焦点状态,否则使用的keybd_event则无法将字符发送给edit框。如果使用有焦点的状态则会导致edit控件跟我自己编写的键盘耦合性太大。
3、由于使用duilib的tilelayout而出现键盘的所有按键无法正常对齐。
解决方案:
1、使用keybd_event()则是模拟咱们在普通的键盘上的各种按键操作。要出现大写字母或者其他的"@#$%"等字符,则需要模拟键盘的输入 shift+对应的位置的字符。(这里我使用查表的方式,进行操作。当需要按shift键+其他按键才能实现的放在同一组,而另外的不许shift按键的以相同的顺序放在另一组。)(这里有一个技巧来获取每个字符对应的键值:编写一个能够获取键值的小软件,然后将每个按键的键值获取到。并通过刚才使用的查表方式对应的字符在第几个位置,从而发送该按键的键值)
2、键盘不能有焦点状态,则需要在创建这个键盘的dialog的时候设置GLW_EXSTYLE的字段WS_EX_NOACTIVATE
3、经过研究tilelayout跟horizontallayout的源码发现tilelayout的布局方式跟horizontallayout的布局计算方式不一样(SetPos函数),而导致了使用tilelayout布局方式出现无法正常对其的方式。(该计算方式应该是tilelayout的计算思路有问题导致的)。 最后使用了horizontalalyout的简单布局方式进行操作。
二、如何让edit控件获取到焦点的时候,调用我的键盘
我的软件使用的是duilib界面库,则当CEditUI获取到焦点的时候会创建CEditWnd,该类是创建原生态的Edit。当CEditUI失去焦点的时候就会销毁CEditWnd类,从而销毁临时创建的原生态Edit。所以很简单的思路就是在构造函数里调用我的键盘,在析构函数里面销毁我的键盘。
而在构造函数里面没有对应的CEditUI该窗口所对应的dialog句柄,所以修改了CEditWnd的源码
从 void Init(CEditUI* pOwner)该pOwner参数提到构造函数CEditWnd(CEditUI* pOwner)
从而可以简单的实现了键盘的调用跟对键盘的使用。
三、因为我使用的是下位机wince的移动设备,从而导致的一个现象是:当edit在屏幕靠下的地方时,键盘会挡住edit
需要解决的第一个办法是让用户手动移动键盘,这样子就能看到对应edit控件。但是这样子用户体验不好。
所以使用了另一种方式:当键盘把edit挡住的时候,软件自动上移,以防挡住edit。(这里遇到上移时候,刚开始调试时候出现了直接失去焦点的现象,具体原因是什么,怎样解决的,突然忘记了。。。)。
四、有时候用户在获得键盘之后,输入完成了,不想让键盘失去焦点,只想让键盘消失。则我在键盘上面做了一个失去点击隐藏键盘的按钮之后使键盘消失。但是焦点还在edit上面
需要解决的是:当点击隐藏按钮之后,会出现edit也失去焦点了(因为软件下移过程中导致失去了焦点,具体原因忘记了/qiao),当移动完成之后则edit会重新获得焦点,而重新调用键盘。所以我这里做了一个小聪明的技巧:放置一个全局的计数。当点击隐藏按钮时属于异常情况所以设置该计数小于零,当程序再次进来要调用键盘按钮的时候,设回该变量的初始状态,然后直接返回而不去显示键盘。
ps:因为在公司源码无法拷贝出来,所以只写出了对应的涉及思路。并且前段时间比较忙而没有记录对应的出现问题,而出现断片。。。,所以有的问题的原因忘记了。
但是使用该最终的思路还是可以正常的做出键盘调用。和键盘制作。
标签:
原文地址:http://www.cnblogs.com/cxiaoln/p/5052189.html