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