先介绍下原虚拟键盘的思路:采用位图显示虚拟键盘,然后将每个按键的矩形框坐标和对应的键值记录下来。当用户在触摸板上按键时产生MSG_LBUTTONDOWN事件,LPARAM带有输入法窗口坐标,在预先定义的矩形坐标-键值对应表中查表获取按键信息。根据键值向输入法窗口发送MSG_KEYDOWN、MSG_KEYUP、MSG_CHAR消息,模拟了标准键盘的输入。 理解了触摸板的虚拟键盘输入,设计基于光标按键和确认键、返回键的虚拟键盘输入法就不难了。首先将原矩形坐标-键值对应表修改成2维数组的方式定义行列:static struct _key_rect key_rect[KEY_ROW][KEY_COW],排列方式同位图键位。在MSG_KEYDOWN、MSG_KEYUP事件中截获光标按键和确认键、返回键进行处理,利用光标键实现虚拟键盘选中区域的移动,利用确认键实现选中键值的提交,为区别真实的按键信息,需定义虚拟键盘信息:#define MSG_KEYDOWN_VK MSG_USER+1 #define MSG_KEYUP_VK MSG_USER+2。在这2个新增的消息处理中实现原触摸板的MSG_KEYDOWN、MSG_KEYUP功能。另外选中区域移动的重绘:keydown时重绘新选中区域,keyup时重绘老的选中区域。 基于上述思路就可基本实现光标键的输入法了,后面我进行了小的改进: 1.ps了虚拟键盘位图,使用“DEL”功能键替换了原“Ctrl”功能键(这个ctrl键也没用到)。 2.ps了左下角“中/英文”切换图 3.实现了DEL功能键、重定义了返回键的作用为关闭输入法。 4.在输入法激活时会调用MSG_PAINT消息,在增加了“中/英文”切换后位图的需使用位图的组合更多了,实际上激活输入法时得进行3个重绘,顺序如下:重绘底图->重绘“中/英”切换键->重绘最后的选中键,我使用了一个计数器结合虚拟键盘区域依次失效方法完成了上诉功能。 5.汉字输入时涉及汉字的翻页,使用“-”“=”来翻页,我在返回键的处理中将光标左键转化成了“-”,光标右键转化成了“=”。 6.对按键输入引擎IAL进行了优化,当同时按光标上键和光标下键时产生“TAB”键输入,以实现MINIGUI各控件间的切换。 7.最后你可能需要改进键盘的驱动或MINIGUI的输入引擎,使其2个KEYDOWN事件必须保证一定的间隔,否则MSG_PAINT会混乱,这是由于MINIGUI对MSG_PAINT的处理方式决定的。(为保证MSG_PAINT的优先级,系统采用了某个标识位来定义窗口是否需要重绘,而且当其重绘完成后,将直接清除改标识。如果在极短的时间里使2个矩形区域失效,实际上只会产生一此MSG_PAINT消息) |
|
来自: astrotycoon > 《minigui》