对话框中有两个编辑框控件,第一个输入号码,第二个输入其他属性。想要实现输入号码后,根据后台数据库确定该号码的合法性,如不合法,弹出另一对话框提示错误。这一点可以实现,问题是:由于必须通过WM_SETFOUCS或WM_KILLFOCUS来确认号码的输入完成,如果号码不合法,弹出提示对话框时,该提示对话框获得焦点,即发出WM_KILLFOCUS消息,而号码编辑框会相应这个消息,号码的合法性效验和弹出错误提示对话框的代码也是在这个相应函数中的,形成了死循环,如何解决?
Cdlg::OnS
Cdlg::OnS
{
.....//效验Hm的合法性
if(号码不合法)
messageBox("错误“);
...
}
当HM编辑控件发出WM_KILLFOCUS时,该函数被调用,而有错误时,弹出错误提示对话框,弹出的同时,又发出WM_KILLFOCUS,而改函数有被调用,象中情况如何处理?
{
if(m_test != "a")
{
this->MessageBox("error");
}
}
void CTestDialog::OnSetfocusEdit2()
{
if(m_test != "a")
{
this->MessageBox("error");
this->OnKillfocusEdit2();
}
}
还是不行,有高手旁观吗,给咱讲讲啊
yangrp(yangrp) ,判断数据合法与否的语句可以加在点检查按钮的响应函数里呀
{
if(m_test != "a")
{
this->MessageBox("error");
}
Edit2.SetFocous();
}
就拿这个例子说吧,焦点移出第一个控件,在弹出错误对话框时并没有移到第二个控件阿?这时焦点是谁,不知道,但肯定不是EDIT1,我估计是父窗口对话框,这时MessageBox("error"),发出WM_KILLFOCOUS,但目标肯定不是EDIT1,EDIT1的OnKillFocous相应函数不会相应,所以不会有死循环。至于你说Message()把焦点还给原来的拥有者我想也是这样,实践证明的阿!我考虑了一下,采用控件相应WM_KILLFOCUS的办法有很大的缺陷,比如说我激活其他不相关的窗口,焦点发生变化就会进行效验,还容易出现死循环的状况。因此我觉得最好不要采用焦点消息的办法实现。而你说的采用DDV的方式也需要考虑在什么地方进行UPDATEDATA(TRUE),象这样的问题你一般是怎么处理的?又没什么方法可以实现一个控件,原来没有被选中,现在被选中了。但不用焦点的消息的方法
下面是本人的解决方法,很笨,但还是可行的!
class CAboutDlg : public CDialog
{
.....
private:
bool b_flag;
...
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
b_flag=true;
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::OnSetfocusEdit2()
{
// TODO: Add your control notification handler code here
CString str;
m_Edit1Ctrl.GetWindowText(str); if(b_flag&&str!="psusong")
{
b_flag=false;
m_Edit1Ctrl.SetFocus();
MessageBox("The data is error ,please input again!"); }
}void CAboutDlg::OnSetfocusEdit1()
{
// TODO: Add your control notification handler code here
b_flag=true;
}