输入法编程之 光标跟随
来源:互联网 发布:目前淘宝网店卖什么 编辑:程序博客网 时间:2024/05/17 06:04
typedef tagCANDIDATEFORM { //列表窗口信息
//由IMC_GETCANDIDATEPOS和IMC_SETCANDIDATEPOS消息处理
DWORD dwIndex; //列表窗口序号
DWORD dwStyle; //属性:
//=CFS_CANDIDATEPOS 指定显示位置
//=CFS_EXCLUDE 不可显示
//=CFS_DEFAULT 根据需要显示
POINT ptCurrentPos; //坐标位置
REC rcArea; //不可显示区
} CANDIDATEFORM;
其中ptCurrentPos就是我们需要的光标位置,不过因为这是客户区的坐标,需要转化为屏幕坐标才能使用。要使得输入法上下文结构INPUTCONTEXT中已经填入了正确的坐标位置,需要实现WM_IME_NOTIFY消息响应事件。在WM_IME_NOTIFY消息的子消息IMN_SETCOMPOSITIONWINDOW(设置编码窗口消息)被触发时,系统会返回正确的坐标位置。WM_IME_NOTIFY消息响应函数类似如下形式:
/*
* IMENotifyHandle():
*
* Handle WM_IME_NOTIFY messages.
*/
LONG IMENotifyHandle(HIMC hUICurIMC, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LONG lRet = 0L;
LPINPUTCONTEXT lpIMC;
if (!(lpIMC = ImmLockIMC(hUICurIMC)))
return 0L;
switch (wParam)
{
case IMN_CLOSESTATUSWINDOW:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_CLOSESTATUSWINDOW/n");
/// hide the status window
g_pStatus->Hide();
break;
case IMN_OPENSTATUSWINDOW:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_OPENSTATUSWINDOW/n");
/// create the status window, but don't show
g_pStatus->Create(hWnd);
break;
case IMN_OPENCANDIDATE:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_OPENCANDIDATE/n");
break;
case IMN_CHANGECANDIDATE:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_CHANGECANDIDATE/n");
break;
case IMN_CLOSECANDIDATE:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_CLOSECANDIDATE/n");
break;
case IMN_SETCONVERSIONMODE:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_SETCONVERSIONMODE/n");
/// repaint the status window
g_pStatus->Repaint();
break;
case IMN_SETSENTENCEMODE:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_SETSENTENCEMODE/n");
break;
case IMN_SETOPENSTATUS:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_SETOPENSTATUS/n");
/// repaint the status window
g_pStatus->Repaint();
break;
case IMN_SETCANDIDATEPOS:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_SETCANDIDATEPOS/n");
break;
case IMN_SETCOMPOSITIONFONT:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_SETCOMPOSITIONFONT/n");
break;
case IMN_SETCOMPOSITIONWINDOW:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_SETCOMPOSITIONWINDOW/n");
/// adjust the postion of comp and cand windows
POINT ptSrc;
SIZE szOffset;
HDC hDC;
ptSrc = lpIMC->cfCompForm.ptCurrentPos;
ClientToScreen(lpIMC->hWnd, &ptSrc);
hDC = GetDC(lpIMC->hWnd);
GetTextExtentPoint(hDC,"A",1,&szOffset);
ReleaseDC(lpIMC->hWnd,hDC);
g_ptTopLeft.x = ptSrc.x + szOffset.cx;
g_ptTopLeft.y = ptSrc.y + szOffset.cy;
break;
case IMN_GUIDELINE:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_GUIDELINE/n");
break;
case IMN_SETSTATUSWINDOWPOS:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_SETSTATUSWINDOWPOS/n");
break;
case IMN_PRIVATE:
TRACE("UIWnd:WM_IME_NOTIFY:IMN_PRIVATE/n");
break;
default:
break;
}
ImmUnlockIMC(hUICurIMC);
return lRet;
}
其中,需要注意的是要确保获取正确的位置,必须有先发送过WM_IME_STARTCOMPOSITION消息,这个消息一般在刚开始输入新拼音时候发送!关于IME消息处理可以看MSDN相关文档。
即便如此,仍然不能保证在所有程序中,输入法都能正确地体现光标跟随,我遇到的情况是在UtraEdit中,上述代码毫无作用,IMN_SETCOMPOSITIONWINDOW根本就没有被系统触发,这时我只好通过GetCaretPos来侥幸地获取光标位置。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1349102
- 输入法编程之 光标跟随
- 输入法编程之 光标跟随
- ibus输入法不跟随光标的解决办法
- linux中文输入法,ibus光标不跟随
- sublime text 输入法不跟随光标
- intellij 15 输入法光标不跟随?换个输入法解决
- Qte中实现输入法窗口跟随光标移动功能
- [转]Ubuntu SCIM 输入法不能光标跟随的解决
- sublime 中文乱码,输入法光标不跟随的使用问题
- NetBeans 中文输入法词语候选区不跟随光标
- 自写的文本框 输入法框跟随光标 实现方法
- 解决idea下输入法光标不跟随的方法
- 好烦啊,IDEA输入中文时输入法候选词框不跟随光标
- Android studio 中搜狗输入法 中文提示不跟随光标
- 【SublimeText3】输入法候选窗口跟随光标/安装插件
- 光标 与 输入法 之 android:imeOptions属性
- Linux Mint 17 KDE版中ibus输入法无法光标跟随问题的解决
- android studio中写中文注释时,输入法不跟随光标问题
- java转义字符
- Eclipse插件开发
- 经典《C程序设计第二版--谭浩强》 视频
- 用Windows批处理备份文件。。。
- js的正则表达式详解
- 输入法编程之 光标跟随
- ASCII码对照表
- 鬼子进村了
- 相亲
- 新年好
- 全网软件:高级信息搜索数据采集软件 InfoSeek & FastSeek
- Ubuntu 6.10安装Eclipse
- 一个莫名奇妙问题的解决,数据大了后form不提交了
- 肥去,倒计时.