windows客户端开发--如何修复输入法提示框位置不正确

应该也有人会遇到这样的困扰:就是在edit或是richedit控件中输入时,输入法的提示框位置不正确。

何为HIMC

什么是IME (Input Method Editors)?广义上讲,IME是微软提供的Windows平台的一套输入法编程规范,依照这套规范(框架),你不需要处理太多输入法特性相关的操作(光标跟随,输入捕获,字码转换后输出到应用程序等),你只需要使用IME规范里面提供的工具函数(imm32库),实现规范所指定必须导出的接口即可。实际上你要做的就是写一个导出函数包含IME规范规定的接口的dll,所以,狭义上讲IME就是你写的这个dll。

HIMC实际上是个DWORD类型,一般在启动或关闭输入法时用到。
头文件和库:

#include   <imm.h> 
#pragma   comment(lib, "imm32.lib ")

如何获取HIMC

通过函数:ImmGetContext
Returns the input context associated with the specified window.

An application should routinely use this function to retrieve the current input context before attempting to access information in the context.
The application must call ImmReleaseContext when it is finished with the input context.

重要的是看返回值:
Returns the handle to the input context.

结构体COMPOSITIONFORM 是干什么的?
作用:
Contains style and position information for a composition window.
原型:

typedef struct tagCOMPOSITIONFORM {
  DWORD dwStyle;
  POINT ptCurrentPos;
  RECT  rcArea;
} COMPOSITIONFORM, *PCOMPOSITIONFORM;

GetCaretPos函数就不需要再解释了:
该函数将插入标记的位置(按客户区坐标)信息拷贝到指定的POINT结构中

ImmSetCompositionWindow函数怎样设置的?
作用:
Sets the position of the composition window.
原型:

BOOL ImmSetCompositionWindow(
  _In_ HIMC              hIMC,
  _In_ LPCOMPOSITIONFORM lpCompForm
);

等等,我们还没有完。

就像获得设备描述表一样,有获取,就要有释放.

ImmReleaseContext函数来释放:
作用:
此函数释放输入上下文和解锁相关联的内存。应用程序必须调用ImmReleaseContext为对应每一个ImmGetContext。
原型:

BOOL ImmReleaseContext(
HWND hWnd,
HIMC hIMC
);

有了以上的储备,工作变得简单。

if (uMsg == WM_IME_COMPOSITION)
{
        HIMC hIMC = ImmGetContext(m_hWnd);//获取
        if (hIMC)
        {
            // Set composition window position near caret position
            POINT point;
            GetCaretPos(&point);//获取输入光标位置,存入point结构体

            COMPOSITIONFORM Composition;
            Composition.dwStyle = CFS_POINT;
            Composition.ptCurrentPos.x = point.x;
            Composition.ptCurrentPos.y = point.y;
            ImmSetCompositionWindow(hIMC, &Composition);//设置

            ImmReleaseContext(m_hWnd, hIMC);//释放
        }
}

good job!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一苇渡江694

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值