我在一个编辑框失去焦点时检查其中的数据有效性,当数据无效时想不让这个编辑框失去焦点,也就是说焦点继续在这个编辑框中,我搞了很久都没实现这个功能,请各位高手支个招吧,郁闷了好几天了

解决方案 »

  1.   

    响应EN_CHANGE
    CXXXDLG::OnChangeEdit1()
    {
        CString str;
        m_edit1.GetWindowText(str);
        if( !str合法 )
        {
             m_edit1.SetFocus();
        }
    }
      

  2.   

    响应EN_CHANGE会造成每个字符都引起我的判断程序,而在数据没输入完是无法判断是不是
    正确的
      

  3.   

    楼上的你试过吗? 就说正解楼主说的是失去焦点响应  ON_EN_KILLFOCUSvoid CDialogTest2Dlg::OnKillfocusEdit1() 
    {
    CString str;
    GetDlgItemText(IDC_EDIT1, str);
    if (str != "test") 
    {
                      //不合法
    GetDlgItem(IDC_EDIT1)->SetFocus();
    }
    }
      

  4.   

    响应WM_KILLFOCUS,然后判断是否有效,无效则调用SetFocus
      

  5.   

    我试过EN_KILLFOCUS,会造成程序的操作不方便。。
      

  6.   

    谢谢大家的支持,我想说明一下,我是在CListCtrl中的可编辑单元格中响应了WM_KILLFOCUS,
    鼠标在点到其他可编辑格中时判断发现输入的数据非法,然后想重新聚集到原来的格子中,
    SetFocus()没有用呀
      

  7.   

    SetActiveWindow();
    SetFocus();一起用才行
      

  8.   

    不知道这个办法行不行,如果用sdk编程,可以用子类别化的方法,具体操作是:1.首先定义如下的变量和函数,函数用来接管编辑控件的消息处理,在你的程序当中我想只需要处理  WM_KILLFOCUS 消息就可以了。DefEditProc用来保存编辑控件原来的消息响应函数,以便保证编辑控件的正常响应。LRESULT CALLBACK EditProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
    WNDPROC DefEditProc;2.在编辑控件产生的时候用DefEditProc=SetWindowLong(HWND,int)来新的消息函数设置给控件,返回值是原来的消息响应函数,用DefEditProc来保存,而EditProc的定义你可以参考以下的内容:
        switch(msg) 
    {
    case WM_KILLFOCUS: //TODO:Check the data here!
                      //........
    break;
    }
    return CallWindowProc(DefEditProc,hwnd,msg,wparam,lparam);如果你用MFC编写,我想应该从CEDIT派生出一个新类,然后处理新类中的WM_KILLFOCUS消息(记得要调用父类的响应函数,否则可能没有办法正常显示控件)。
      

  9.   

    好像是这个消息 LVS_EDITLABELS