编辑框失去焦点出现的问题 本帖最后由 xiaoji0507 于 2011-04-09 09:35:51 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 WM_EN_KILLFOCUS(EDIT1,OnKillfocusEdit1)WM_EN_KILLFOCUS(EDIT1,OnKillfocusEdit2)代码写错了吧? 你想要EN_KILLFOCUS的同时也添加处理EN_SETFOCUS通知BOOL bEdit1 = FALSE; // 定义为成员变量BOOL bEdit2 = FALSE; // 定义为成员变量void CXXXDlg::OnKillfocusEdit1() { // TODO: Add your control notification handler code here if(bEdit1) { bEdit1 = FALSE; AfxMessageBox(_T("1")); }}void CXXXDlg::OnKillfocusEdit2() { // TODO: Add your control notification handler code here if(bEdit2) { bEdit2 = FALSE; AfxMessageBox(_T("2")); }}void CXXXDlg::OnSetfocusEdit1() { // TODO: Add your control notification handler code here bEdit1 = TRUE;}void CXXXDlg::OnSetfocusEdit2() { // TODO: Add your control notification handler code here bEdit2 = TRUE; } 不好意思,手误。下面一个是EDIT2。 更正一下题目中的错误: WM_EN_KILLFOCUS(EDIT1,OnKillfocusEdit1) WM_EN_KILLFOCUS(EDIT1,OnKillfocusEdit2) 应该是ON_EN_KILLFOCUS(EDIT1,OnKillfocusEdit1)ON_EN_KILLFOCUS(EDIT2,OnKillfocusEdit2)再次谢谢大家的答复... AfxMessageBox 会使焦点变得混乱,将失去焦点时的提示信息写入文件或用OutputDebugString输出看看,就正常了 这种情况下,你不能用 MessageBox() 消息框来测试,比如:你有两个Edit控件,Edit1、Edit2.你先把光标放到Edit1 控件里面,随便输入或者不输入,然后,移动鼠标点击Edit2 控件里面,本来,这时候,应该是响应 Edit1 控件的 OnKillfocusEdit1() 函数的,但是,你在这个响应函数里面用了MessageBox() 来弹出对话框,在这一瞬间你可以看到Edit2 控件里面的光标消失了,也就是Edit2 失去了输入焦点,这时候,系统又响应Edit2 的 OnKillfocusEdit2() 函数去了,执行完了后才回到刚才 OnKillfocusEdit1() 里面。这个可能是系统优先响应的问题。囧你可以不用MessageBox() 来测试到底响应了哪个函数,换个思路,你可以在 界面上再添加一个控件,比如 Edit3,然后在你的 Edit1、Edit2 两个控件的 OnKillfocusEditX() 函数里面,给Edit3 控件赋值,比如,在 OnKillfocusEdit1() 里面,添加代码:SetDlgItemInt(IDC_EDIT3,1);//表示当前的状态为Edit1 控件失去了输入焦点同样在 OnKillfocusEdit2() 里面,添加代码:SetDlgItemInt(IDC_EDIT3,2);//表示当前的状态为Edit2 控件失去了输入焦点这样的话,你会发现,当Edit1 失去焦点后,确实只是调用了OnKillfocusEdit1() ;而在Edit2 控件失去输入焦点后,确实只调用了 OnKillfocusEdit2()。以上纯属个人意见,如有不妥,请矫正! 除了GetWindowRect()还有方法获取屏幕坐标吗? 学MFC不到一个月,想听听各位前辈们的看法、想法、、、、未来前景 为什么线程会使recvfrom函数返回错误? 问一个字符集装换问题 高手请进来一下,急~~~~~~中午前结贴(100分) 如何在启动时隐藏对话框! 已经有一个动态库,怎样生成Lib文件? 打不开文件 怎样选择合适的应用程序打开一个文件? 创建一个标准模板 求问数据库MFC编程 关于子窗口的zorder
WM_EN_KILLFOCUS(EDIT1,OnKillfocusEdit2)代码写错了吧?
BOOL bEdit1 = FALSE; // 定义为成员变量
BOOL bEdit2 = FALSE; // 定义为成员变量void CXXXDlg::OnKillfocusEdit1()
{
// TODO: Add your control notification handler code here
if(bEdit1)
{
bEdit1 = FALSE;
AfxMessageBox(_T("1"));
}
}void CXXXDlg::OnKillfocusEdit2()
{
// TODO: Add your control notification handler code here
if(bEdit2)
{
bEdit2 = FALSE;
AfxMessageBox(_T("2"));
}
}void CXXXDlg::OnSetfocusEdit1()
{
// TODO: Add your control notification handler code here
bEdit1 = TRUE;
}void CXXXDlg::OnSetfocusEdit2()
{
// TODO: Add your control notification handler code here
bEdit2 = TRUE;
}
不好意思,手误。下面一个是EDIT2。
WM_EN_KILLFOCUS(EDIT1,OnKillfocusEdit1)
WM_EN_KILLFOCUS(EDIT1,OnKillfocusEdit2)
应该是ON_EN_KILLFOCUS(EDIT1,OnKillfocusEdit1)
ON_EN_KILLFOCUS(EDIT2,OnKillfocusEdit2)
再次谢谢大家的答复...
将失去焦点时的提示信息写入文件或用OutputDebugString输出看看,就正常了
你先把光标放到Edit1 控件里面,随便输入或者不输入,然后,移动鼠标点击Edit2 控件里面,本来,这时候,应该是响应 Edit1 控件的 OnKillfocusEdit1() 函数的,但是,你在这个响应函数里面用了MessageBox() 来弹出对话框,在这一瞬间你可以看到Edit2 控件里面的光标消失了,也就是Edit2 失去了输入焦点,这时候,系统又响应Edit2 的 OnKillfocusEdit2() 函数去了,执行完了后才回到刚才 OnKillfocusEdit1() 里面。
这个可能是系统优先响应的问题。囧
你可以不用MessageBox() 来测试到底响应了哪个函数,换个思路,你可以在 界面上再添加一个控件,比如 Edit3,然后在你的 Edit1、Edit2 两个控件的 OnKillfocusEditX() 函数里面,给Edit3 控件赋值,比如,在 OnKillfocusEdit1() 里面,添加代码:
SetDlgItemInt(IDC_EDIT3,1);//表示当前的状态为Edit1 控件失去了输入焦点同样在 OnKillfocusEdit2() 里面,添加代码:
SetDlgItemInt(IDC_EDIT3,2);//表示当前的状态为Edit2 控件失去了输入焦点这样的话,你会发现,当Edit1 失去焦点后,确实只是调用了OnKillfocusEdit1() ;而在Edit2 控件失去输入焦点后,确实只调用了 OnKillfocusEdit2()。以上纯属个人意见,如有不妥,请矫正!