中文输入法下响应OnChar的问题

andyzhshg 2009-07-30 11:39:54
我的程序里用OnChar捕捉字符的输入,并对捕捉的字符进行一定的操作(主要是插入操作)这一操作比较费时,输入英文时因为每按

键一次就出发一个OnChar,而按键速度不会太快,所以速度还可以接受。但输入中文时因为是系统对输入的字符进行缓冲,即键入一

串字符再回车后,系统向程序发送一系列的OnChar消息,连续处理这一系列OnChar消息就显得很慢。
我的想法是写一个插入字符串的方法,把一次输入的所有字符接收完毕后统一进行插入,但是现在我不知道如何判断每次回车前用户

到底敲入了多少字符,不知哪位有没有相应的经验。
...全文
284 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
socoola 2009-07-30
  • 打赏
  • 举报
回复
申请一个缓冲区,OnChar接收到字符都缓冲到这里,长度用一个变量记录。当用户敲回车键之后从缓冲区中取出数据插入
andyzhshg 2009-07-30
  • 打赏
  • 举报
回复
多谢,已经解决了基本是按照5楼的方法。、
结贴。
zhangyan_wt 2009-07-30
  • 打赏
  • 举报
回复
阻止不了,因为系统会先发一个WM_IME_ENDCOMPOSITION再发一堆WM_CHAR。

我原来是这样做的,加一个变量计数,当遇到IME输入的时候,记录总字数和剩余字数,然后在OnChar里数数,直到最后一个字符的时候才真正做事。对了,我的程序是Unicode的,所以每个字符都占2个字节。
在WindowProc里

if(message == WM_IME_ENDCOMPOSITION)
{
HIMC hIMC = ImmGetContext(this->m_hWnd);
m_nIMECharLeft = m_nIMECharSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, 0, 0);
ImmReleaseContext(this->m_hWnd, hIMC);
}

在OnChar里

if(m_nIMECharSize == 0)
DoInputChar(nChar);
else
{
m_nIMECharLeft -= 2;
if(m_nIMECharLeft == 0)
{
HIMC hIMC = ImmGetContext(this->m_hWnd);
WCHAR pBuf[1000]= {0};
DWORD dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, pBuf, 1000);
ImmReleaseContext(this->m_hWnd, hIMC);
DoInputString(pBuf);
m_nIMECharSize = 0;
}
}
andyzhshg 2009-07-30
  • 打赏
  • 举报
回复
3楼的方法很有帮助
我想再问一下如果我在WM_IME_ENDCOMPOSITION中处理了字符串
我怎么阻止输入法再向程序发送WM_CHAR消息?
zhangyan_wt 2009-07-30
  • 打赏
  • 举报
回复
可以用WM_IME_XXX消息,以及相应的ImmXXX函数


LRESULT CXXXView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == WM_IME_ENDCOMPOSITION)
{
HIMC hIMC = ImmGetContext(this->m_hWnd);
m_nIMECharSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, 0, 0);
ImmReleaseContext(this->m_hWnd, hIMC);
}
return CScrollView::WindowProc(message, wParam, lParam);
}
shakeyou123 2009-07-30
  • 打赏
  • 举报
回复
用一个cstring去保存用户输入的内容,当用户输入回车时读取CSTRING里面的内容

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧