各位朋友请多指教帮忙, 我不知该如何处理, 我现在非常郁闷.我想用EN_CHANGE 事件做如下的数据查询:
(用全拼输入法)输入 '你' 时 
触发一次EN_CHANGE 事件
做查询 SELECT * FROM ... WHERE ... LIKE '%你'...输入 '你好' 时
触发一次EN_CHANGE 事件
做查询 SELECT * FROM ... WHERE ... LIKE '%你好'...但事实却是这样:void CTestDlg::OnEnChangeEdit3()
{
         CString str;         // 触发后得到CEdit的内容
GetDlgItem(IDC_EDIT3)->GetWindowText(str);         // 触发后CEdit的内容
::AfxMessageBox(str);
}我想在用全拼输入法时,输入词组时 (nihao 1.'你好' 2... 3...) 选择1时, CEdit 的显示的内容为 '你好' EN_CHANGE 事件只触发一次, 做一次查询, 然而输入一词组 '你好' 时, 触发了两次 EN_CHANGE 事件
第一次 str 的内容为 '你好',
第二次 str 的内容为 '你',
控件显示的是 '你好'.问题:
1:
这导致我每次做查询时, 条件不对, 第一次为'你好%',第二次为'你%',
多了一次还不说, 顺序也不对, 为什么顺序不是 ('你' '你好') ?2:
有什么办法输入一词组(有多字)只触发一次EN_CHANGE 事件?

解决方案 »

  1.   

    不用EN_CHANGE 事件,换为回车响应就是了。如何在控件里响应左右键消息:
    BOOL CMydilog::PreTranslateMessage(MSG* pMsg) 
    {
        if(GetFocus()==GetDlgItem(IDC_EDIT2))//判断焦点在不在框内
            if(pMsg->message==WM_RETURN)
                 ......//你的处理代码
          
      

  2.   

    EN_CHANGE 事件 也就是在你改变内容时就触发的。所以你输入一个就会解发一个
      

  3.   

    你到codeproject里找自动完成edit控件参考一下
      

  4.   

    EN_CHANGE是在你改变edit中内容时就触发的,所以你两个字就触发两次。
      

  5.   

    没有用UpdateData函数更新.这样是写不到变量的.
      

  6.   

    十分感谢大家的指教:To  laiyiling(最熟悉的陌生人):
    这个查询规定输入一字后(不用敲回车键)就自动匹配查询一次, 所以不能指望用回车处理.To zhucde(【風間苍月】)(MS_MVP) ; windyloft(好好吃饭) 
    使用EN_KILLFOCUS, 在输入后不一定回产生KILLFOCUS, 而且EN_KILLFOCUS情况还很多. To  carbon107(<软件开发思想.h>) ;  lixiaosan(小三) 
    那为什么用GetWindowText(str)时
    其缓冲的内容会变化?
    第一次 str 的内容为 '你好',
    第二次 str 的内容却变为 '你',
    控件显示的是 '你好'.这让我如何处理是好?
      

  7.   

    To syy64(太平洋):输入结束是输入法控制的, 怎么样知道他输入完了, 并且在何处拦截此输入的数据?谢谢你 syy64(太平洋);这个问题还是未得到解决, 还望多指教.
      

  8.   

    处理 WM_IME_* 消息。
    处理 WM_IME_* 消息时不处理 EN_CHANGE 消息。
      

  9.   

    int len=0,oldlen=0;
    CString str;void CTestDlg::OnEnChangeEdit3()
    {
             
             // 触发后得到CEdit的内容
    GetDlgItem(IDC_EDIT3)->GetWindowText(str);
             len=str.GetLength( );
             //str[len-oldlen]为新内容。
             //输入一词组 '你好' 时, 触发了两次 EN_CHANGE 事件
             //第一次 str[len-oldlen]  的内容为 '你',
             //第二次 str[len-oldlen] 的内容为 '好',
             //控件显示的是 '你好'.
             oldlen=len; 
             // 触发后CEdit的内容
    ::AfxMessageBox(str);
    }
      

  10.   

    To laiyiling(最熟悉的陌生人)不好意思, 结贴时误操作, 你的分没上去, 下次一定加倍补上!