emWin 2天速成实例教程012_基于STM32单片机的全键盘中文汉字拼音输入法

时间:2022-02-10 23:33:07

备注:(1)打开工程目录下的"Exe\GUISimulationDebug.exe"即可看到效果。(2)看完教程000~005就基本会用emWin做项目,其他章节可以需要时再参考。

这个emWin的中文拼音输入法已经做的很完善,也经过比较详细的测试,可以直接拿来当做模板使用(根据需要修改键盘的大小);实现的程序也非常简洁,同时也使用了emWin的一些知识点,值得阅读学习;若你还不会用emWin,可以看:”emWin 2天速成实例教程”。

 

使用例程:
用emWin脱机模拟仿真软件Code::Blocks(”软件/资料下载”栏目可下载)打开工程文件:SimulationTrial.cbp然后编译工程:

emWin 2天速成实例教程012_基于STM32单片机的全键盘中文汉字拼音输入法


运行emWin中文拼音输入法程序:

emWin 2天速成实例教程012_基于STM32单片机的全键盘中文汉字拼音输入法


点击编辑框后自动弹出键盘的实现方法:

emWin 2天速成实例教程012_基于STM32单片机的全键盘中文汉字拼音输入法

总体思想是在ID_EDIT_0~ID_EDIT_5点击消息中用WM_ShowWindow()函数显示出键盘,并在”Ese”按键的点击消息中用WM_HideWindow()函数隐藏键盘:

emWin 2天速成实例教程012_基于STM32单片机的全键盘中文汉字拼音输入法


而下面这段程序的作用是判断并移动键盘到合适的位置:

emWin 2天速成实例教程012_基于STM32单片机的全键盘中文汉字拼音输入法

总体的思想是判断键盘有没有超出屏幕范围,如果超出则移动键盘到合适的位置,WM_GetWindowOrgX(pMsg->hWinSrc)是获取编辑框位置的函数,如果不理解” pMsg->hWinSrc”,可以看:emWin 2天速成实例教程005_控件聚焦和用户消息的使用方法,其他API函数可以查阅emWin说明书,这些API函数是非常有用的,可以记住它们。


键盘处理程序:

这里只能简单的说说处理的思想,很多细节还需要耐心去看程序才行。

在初始化消息WM_INIT_DIALOG中,用下面程序禁止掉键盘里面所有按键的聚焦,因为如果不这样做的话,点击键盘之后,焦点光标就不会停留在编辑框了:
for(i=ID_BUTTON_0;i<=ID_BUTTON_34; i++) BUTTON_SetFocussable(WM_GetDialogItem(pMsg->hWin,i), 0);

 

在ID_BUTTON_0~ID_BUTTON_26的点击消息中,根据当前输入法做相应的处理,如果是英文或符号比较简单,获取按键的字符并用GUI_StoreKeyMsg()函数向emWin内部储存键值即可,emWin内部会自动处理并显示到编辑框里去;如果是中文,则将按键字符显示到ID_TEXT_0文本控件(显示拼音的那个),并用WM_SendMessage()函数向ID_TEXT_0发送一个WM_NOTIFICATION_USER+0消息,通知ID_TEXT_0根据自己的内容去检索拼音并将汉字显示到ID_TEXT_1~ID_TEXT_9文本控件中;为什么要用发消息?为什么不直接在那里处理?因为很多地方都需要重新检索并更新ID_TEXT_1~ID_TEXT_9的内容,这样做是不是可以省掉很多程序?可以看出emWin消息的作用了吧?

 

汉字选择:

在ID_TEXT_1~ID_TEXT_9文本控件的点击消息中,把自己的内容显示到当前聚焦的编辑框中去即可:

emWin 2天速成实例教程012_基于STM32单片机的全键盘中文汉字拼音输入法


汉字检索翻页:

这是中文拼音输入法程序设计的难点,如果思路不好,程序会非常臃肿,笔者也是苦苦思索才非常简洁的实现这一点:

emWin 2天速成实例教程012_基于STM32单片机的全键盘中文汉字拼音输入法

基本思想是:在拼音检索时,把检索到的中文字符串分组,每组9个汉字(因为每次显示9个汉字ID_TEXT_1~ID_TEXT_9),每一组对应一个指针并将指针存于pbuffPY[]数组中,这样翻页时就知道怎么做了吧?


这里重点解释下GUI_pUC_API->pfGetCharSize(),这个函数的作用是返回一个汉字占用几个字节,也许你会说:一个汉字不是占用两个字节吗?错!要看你的emWin用什么编码,如果是GBK或GB2312编码占两个字节没错,但如果是UTF-8编码呢?就不是占用两个字节了;是在哪里告诉emWin用什么编码呢?

emWin 2天速成实例教程012_基于STM32单片机的全键盘中文汉字拼音输入法

另外,如果你用的是GBK或GB2312编码,emWin是没有GUI_UC_SetEncodeGBK()和GUI_UC_SetEncodeGB2312()函数的,需要自己实现,也许在德国人眼里,是没有GBK或GB2312概念吧。


源码/软件下载