概述
文件夹“015_输入法封装使用指南_0.0.2”下文件“修改前busi_pbook_linkman_detail_win.c”和“修改后busi_pbook_linkman_detail_win.c”分别为应用输入法封装层之前和应用之后的两个例子(商务助理编辑联系人界面)。
输入法封装层是输入法底层与输入法应用层的接口层,主要负责以下工作:
1.处理与输入法有关的几个消息:
MSG_USER_CHINESEINPUT_MODE_CHANGE 输入法改变
MSG_USER_CHINESEINPUT 通知显示中文字符
MSG_USER_CHINESEINPUT_CHANGE 通知删除当前光标字符,显示参数中字符
MSG_USER_CREATE_SYMBOL_WIN 通知创建输入法符号窗口
MSG_USER_CHINESEINPUT_MOVE_POS 通知中文输入框移动Y轴坐标
2.创建接收输入法底层产生的汉字或其他字符的编辑框。
3.设定当前窗口的输入法切换类型(0表示在拼音->笔画->数字->小写->大写间切换,1表示在数字->小写->大写间切换,输入其它值会按0处理)。
4.设定编辑框的最大输入字节数。
目前输入法封装层集成在公共库libpublic.a中,其接口文件为:pub_input_chinese.h。
1.接口函数
编辑框结构体:
typedef struct tagPubInputEditSt
{
int nTop; //左上角x坐标
int nLeft; //左上角y坐标
int nWidth; //编辑框宽
int Height; //编辑框高
int nMax; //最大输入字节数
}PubInputEditSt;
说明:用来存放所需要创建的编辑框的坐标信息,以及编辑框所规定的最大输入字节数。
函数PubInputModeChangeType
int PubInputModeChangeType(int nModeChangeType);
说明:此函数在编辑窗口的父窗口产生时即调用,用于向输入法封装层传递当前编辑窗口的输入法切换类型(nModeChangeType ,0表示在拼音->笔画->数字->小写->大写间切换,1表示在数字->小写->大写间切换,输入其它值会按0处理)。
函数PublicInputCreateEdit
HWND PublicInputCreateEdit(HWND hWnd ,PubInputEditSt *pstPInputEdi, int nEditWinType, int type);
说明:此函数在编辑窗口的父窗口的回调函数处理MSG_CREATE时调用,用于建立编辑窗口,返回值为所创建编辑窗口的句柄。hWnd为编辑窗口的父窗口的句柄,结构体pstPInputEdi指定了编辑框的坐标信息及最大输入字符个数(如未指定pstPInputEdi->nMax的值,则在此函数中指定最大输入字节数为30),nEditWinType 为编辑窗口的附加属性(此函数创建的编辑窗口只具有WS_VISIBLE,WS_BORDER,ES_BASELINE 三种属性, nEditWinType 可用A | B表示多种属性,如无则传0),type为当前编辑窗口初始化输入法状态。
函数PublicInputMethod
int PublicInputMethod(HWND hWnd ,int pbook, WPARAM wParam, LPARAM lParam);
说明:处理与输入有关的消息:
MSG_USER_CHINESEINPUT_MODE_CHANGE:需要输入法切换状态时,发送此消息
MSG_USER_CHINESEINPUT:输入汉字
MSG_USER_CHINESEINPUT_CHANGE:通知删除当前光标字符,显示参数中字符
MSG_USER_CREATE_SYMBOL_WIN:输入符号
MSG_USER_CHINESEINPUT_MOVE_POS:当需要改变中文输入框的纵坐标时,发送此消息,lParam为改变后的纵坐标值
2.使用步骤
2.1包含输入法封装层头文件:” #include "pub_input_chinese.h”
2.2在需要输入中文的窗口创建时,调用PubInputModeChangeType()来设定当前窗口的输入法切换类型。
2.3需要输入中文的窗口的回调函数处理MSG_CREATE时,调用PublicInputCreateEdit()创建接收输入法底层产生的汉字或其他字符的编辑框,需要用结构体PubInputEditSt来指定编辑框的坐标位置,如文件夹“000_输入法封装使用指南_0.0.1”中的文件“输入法使用例子busi_pbook_linkman_detail_win.c”(下文称“例子”) 495行所示。
2.4需要输入中文的窗口的回调函数中未处理的消息放入PublicInputMethod()来处理,即将回调函数中内容“return DefaultMainWinProc(hWnd, pbook, wParam, lParam);”修改成“return PublicInputMethod(hWnd,message,wParam,lParam);” ,如例子842行所示。
2.5在需要弹出符号输入框时(处理消息KEY_DOT时)发送消息MSG_USER_CREATE_SYMBOL_WIN,例子775行: SendMessage(hWnd,MSG_USER_CREATE_SYMBOL_WIN,0,0);
在需要输入法切换状态时(处理消息KEY_SWITCH时)发送消息MSG_USER_CHINESEINPUT_MODE_CHANGE,例子785行:
SendMessage(hWnd, MSG_USER_CHINESEINPUT_MODE_CHANGE,0,0);
在需要改变中文输入框的纵坐标时发送消息MSG_USER_CHINESEINPUT_MOVE_POS,例子757行:
SendMessage(hWnd,MSG_USER_CHINESEINPUT_MOVE_POS,wParam,lParam); lParam为改变后的纵坐标值。
3. 注意事项
3.1网格中有多个单元格需要输入中文
如果网格中有某几个单元格需要输入中文,某几个不需要,可以做如下处理:
在窗口回调函数处理MSG_CHAR和SCANCODE_ENTER消息时对这些单元格做不同处理,不需要输入中文的单元格调用return DefaultMainWinProc(hWnd, message, wParam, lParam),使MSG_CHAR消息不再流向PublicInputMethod(),如例子741行到770行中所示。
3.2 PublicInputCreateEdit创建的编辑框
PublicInputCreateEdit创建的编辑框只是用来接收输入法底层产生的汉字或其他字符的,所以进入编辑状态时需将最终保留文本的文本框中的内容写入这个编辑框,跳出编辑状态时再将这个编辑框中的内容写入到最终保留文本的文本框中。
3.3PublicInputCreateEdit函数不可重入
A窗口调用PublicInputCreateEdit()创建一个编辑框a,A窗口未销毁前,B窗口又调用此函数创建另一个编辑框b,当B窗口销毁后,这时在A窗口编辑时会出现死机的问题。这是因为此时编辑的内容还是发往了B窗口创建的编辑框b,但是此时编辑框b已随着B窗口销毁了。解决此问题的方法如下:在A窗口处理消息MSG_PAINT时重新调用PublicInputCreateEdit()。
3.4PublicInputCreateEdit函数的参数nEditWinType
PublicInputCreateEdit函数的原型如下:
HWND PublicInputCreateEdit(HWND hWnd, PubInputEditSt *pstPInputEdi, int nEditWinType, int type);
说明:参数nEditWinType 可为编辑窗口指定附加属性,此函数创建的编辑窗口只具有WS_VISIBLE,WS_BORDER,ES_BASELINE 三种属性,可用A | B表示的方法增加多种属性,如无附加属性则此参数传入0即可。