您的位置:逆风者 VC++ 正文
 添加时间:2008-03-21 原文发表:2008-03-21 人气:180 来源:vckbase.com

本文章共5831字,分4页,当前第3页,快速翻页:
 

/* UINT fuState:Active menu flag(come from msdn) */
/* HIMC hIMC:输入上下文 */
/* return : 返回保存在消息缓冲区lpdwTransKey中的消息个数 */
/****************************************************************************************************************/
逆风者
UINT WINAPI ImeToAsciiEx (UINT uVKey,UINT uScanCode,CONST LPBYTE lpbKeyState,LPDWORD lpdwTransKey,UINT fuState,HIMC hIMC) 这个接口可以说是输入法最重要的部分,程序员需要在这个接口中实现编码与重码的转换,转换完成或者显示在编码窗口及重码窗口,或者发送到应用程序。由于在这个接口中没有传入窗口句柄,如果通知输入法程序的窗口更新显示呢?当然我们可以使用全局变量,在此我个人推荐的方法是使用IME消息(没有什么道理),您将消息类型、参数保存到lpdwTransKey指示的缓冲区中,User.exe会根据消息类型做相应的处理并传递到UIWnd这个窗口中。

那么如何输入文字呢?要输入文字需要3个消息配合使用,分别是WM_IME_STARTCOMPOSITION、WM_IME_COMPOSITION和WM_IME_ENDCOMPOSITION,它们分别指示开始输入编码,输入编码或者结果(视参数而异)及编码输入完成。在开始编写输入法的时候,为了省事,我的输入法在用户确定要输入一个重码时才连续调用这3个消息以向编码器中输入文字。由于WM_IME_STARTCOMPOSITION和WM_IME_ENDCOMPOSITION需要成对使用,这种方法可以确保它们配对。最初这种方式工作得很好,但是后来发现在一些软件中出现兼容性问题。如“智能五笔”在“遨游”中就存在这个问题,在“遨游”中的地址栏中打开“智能五笔”,当需要使用回退键来删除错误输入的编码时,会发现删除的不是编码窗口中的编码而是编辑器中的文字。这是因为类似“遨游”这类软件主动接管了按键输入如处理一些控制键,当它发现这些控制键不在WM_IME_STARTCOMPOSITION和WM_IME_ENDCOMPOSITION这两个消息之间时就自己处理控制键而不是先交给User.exe了。因此正确的流程应该是在开始输入编码时发送WM_IME_STARTCOMPOSITION,输入结束后发送WM_IME_ENDCOMPOSITION消息。

/**********************************************************************/
/* UIWndProc() */
/* IME UI window procedure */
/**********************************************************************/
LRESULT WINAPI UIWndProc(HWND hUIWnd, UINT message,WPARAM wParam, LPARAM lParam)
这是一个非常重要的接口,基本上一它负责各种消息的传递。一般您需要在这个接口中根据不同的消息类型,实现输入法窗口(如编码窗口、重码窗口、状态栏窗口)的显示、隐藏及更新等操作。这个接口实现的功能可能非常复杂,视情况而异,在此就不做更加深入的说明了。在使用时可以参见示例工程。

 

BOOL WINAPI ImeConfigure(HKL hKL,HWND hWnd, DWORD dwMode, LPVOID lpData)
这是最后一个需要注意的接口,在显示输入法属性配置时会Windows会调用这个接口。

 

基本的接口就介绍到这里,下面谈一谈我个人在编写输入法程序时遇到的一些问题或者发现的一些需要注意的地方。

1、关于输入法窗口:阅读一些输入法的代码会奇怪,为什么输入法窗口在创建时需要指定WM_DISABLE属性呢?原来是因为如果不指定这个属性标志,在打开输入法时,会导致当前的应用程序失去输入焦点。但是指定了这个标志后,输入法窗口不能收到鼠标消息怎么办?解决的方法就在于WM_SETCURSOR这个消息。这个消息不管窗口是否可用,只要有鼠标在窗口内窗口都会收到。您可以在这个消息中模拟鼠标消息也可以选择调用SetCapture这个函数,这样窗口就可以收到鼠标消息了。

2、关于窗口模式:使用了几种输入法后,你会发现,有的输入法的编码窗口和重码窗口是一个窗口,有的又是两个窗口,它们有什么区别?或者有的人会觉得这个问题很可笑,但是当您研究了一段输入法可能就会发现您也有类似的问题:因为在输入法的导出接口中关于用户界面的函数就有4个,其它3个分类对应3个窗口回调函数。事实上它们并没有本质的区别,关键在于您的输入法的使用范围。一些软件(如某些游戏)为了界面的整体美观,不希望用户在打开输入法时显示输入法自己的窗口,而是希望输入法按照它的意愿将输入法窗口需要显示的内容显示在它创建的窗口中,英文称之为IME Aware。由于我自己的输入法目标不是在游戏中使用,所在并没有按照这个规矩来管理输入法窗口,而是为了简化,将编码窗口和重码窗口显示的内容放到了一个窗口中。
 

本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 下一页>>
相关文章

多线程管理类
如何实现由列表控件控制的属性表
动态创建控件支持事件响应并可保存与读取
简单录、放音并保存为wav文件程序
I2C通信
文件过滤系统驱动开发Filemon学习笔记
DynamicLayout-VC 6.0对话框动态布局解决方
用命令模式实现对象存储——对象与关系数据
探讨性能测试中的计时问题
对OpenCV中的平面划分相关函数使用探索
MFC 通用控件的初始化
基于GDI+的数字图像处理
运动搜索算法之钻石搜索(Ver1.0)
VC6下的GDI+双缓冲
使用SNMP编辑(添加/删除/修改)ARP表
VC6绘制3D饼状图
强制编译时约束
在C++中实现C#的delegate机制
一个工业控制管道流动控件的实现
Thunk 技术的一个改进

相关评论


本文章所属分类:首页 VC++

  热门关键字: