我的程序里用OnChar捕捉字符的输入,并对捕捉的字符进行一定的操作(主要是插入操作)这一操作比较费时,输入英文时因为每按键一次就出发一个OnChar,而按键速度不会太快,所以速度还可以接受。但输入中文时因为是系统对输入的字符进行缓冲,即键入一串字符再回车后,系统向程序发送一系列的OnChar消息,连续处理这一系列OnChar消息就显得很慢。
我的想法是写一个插入字符串的方法,把一次输入的所有字符接收完毕后统一进行插入,但是现在我不知道如何判断每次回车前用户到底敲入了多少字符,不知哪位有没有相应的经验。

解决方案 »

  1.   

    申请一个缓冲区,OnChar接收到字符都缓冲到这里,长度用一个变量记录。当用户敲回车键之后从缓冲区中取出数据插入
      

  2.   

    用一个cstring去保存用户输入的内容,当用户输入回车时读取CSTRING里面的内容
      

  3.   

    可以用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);
    }
      

  4.   

    3楼的方法很有帮助
    我想再问一下如果我在WM_IME_ENDCOMPOSITION中处理了字符串
    我怎么阻止输入法再向程序发送WM_CHAR消息?
      

  5.   

    阻止不了,因为系统会先发一个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;
    }
    }