模态对话框获取上面EDIT控件的内容 一个模态对话框,就是登陆界面,点击登陆后,我要获得输入的用户名,可是点击OK后窗口就销毁了,UpdataDate就导致程序崩溃了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CLoginDlg dlg.DoModal();UpdateData(TRUE);CString UserName = dlg.m_UserName;这样就行了,点击OK后,其中m_UserName是你的登陆对话框的成员变量;这样 你的用户名就保存在UserName中了 okOrCan=myLoginDlg.DoModal(); myLoginDlg.UpdateData(TRUE); theApp.m_sUserName = myLoginDlg.m_userName; theApp.m_sPassWord = myLoginDlg.m_passWord; if(okOrCan==IDOK)点击OK就崩了; 我用了一个变量关联edit控件的啊 如果在对话框中DDX_Text关联变量,调用DoModal判断是否返回IDOK即可CDialog默认的OnOK函数会在退出前调用UpdateData,见CDialog::OnOK()的原型函数void CDialog::OnOK(){ if (!UpdateData(TRUE)) { TRACE(traceAppMsg, 0, "UpdateData failed during dialog termination.\n"); // the UpdateData routine will set focus to correct item return; } EndDialog(IDOK);}因此直接使用即可if(myLoginDlg.DoModal()==IDOK){ theApp.m_sUserName = myLoginDlg.m_userName; theApp.m_sPassWord = myLoginDlg.m_passWord;} 当点击OK后才把输入的内容保存起来。if(IDOK==myLoginDlg.DoModal()){ myLoginDlg.UpdateData(TRUE); theApp.m_sUserName = myLoginDlg.m_userName; theApp.m_sPassWord = myLoginDlg.m_passWord;}或者直接响应EN_CHANGE消息 我这是模态的对话框啊,直接调用,虽然没有崩溃,判断语句还是没有作用啊。 while(isRight) { okOrCan=myLoginDlg.DoModal(); // myLoginDlg.UpdateData(TRUE); if(okOrCan==IDOK) { if(myLoginDlg.m_passWord==1 && myLoginDlg.m_userName==2)//加入判断用户名密码是否正确 { theApp.m_sUserName = myLoginDlg.m_userName; theApp.m_sPassWord = myLoginDlg.m_passWord; // myLoginDlg.DestroyWindow(); isRight = FALSE; } } else { isRight = FALSE; ::PostQuitMessage(0); // MessageBox(myLoginDlg.m_hWnd,"输入有误","err:",0); } } BOOL CLoginDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(pMsg->message == WM_LBUTTONDOWN ) { CRect rectOk,rectCel; m_btnOk.GetWindowRect(&rectOk); m_btnCancel.GetWindowRect(&rectCel); CPoint point; GetCursorPos(&point); if(rectOk.PtInRect(point)) { UpdateData(TRUE); if(m_userName.IsEmpty() || m_passWord.IsEmpty()) { MessageBox("用户名或密码不能为空"); return FALSE; } m_times++; if(m_userName== "1" && m_passWord=="2") { theApp.m_sUserName = m_userName; theApp.m_sPassWord = m_passWord; CDialog::OnOK(); } else { if(m_times == 3) { MessageBox("密码不正确已达3次,系统将自动退出!"); CDialog::OnCancel(); ::PostQuitMessage(0); } else { CString str ; str.Format("用户名或密码不正确,您还可以输入%d次!",3 - m_times); MessageBox(str); m_userName = ""; m_passWord = ""; UpdateData(FALSE); } } } if(rectCel.PtInRect(point)) { ::PostQuitMessage(0); CDialog::OnCancel(); } } return CDialog::PreTranslateMessage(pMsg);}我重写了PreTranslateMessage(MSG* pMsg) 这个函数解决的。 【请教】rand()%1产生随机数的问题 请高手帮忙:无模式对话框中,为何不响应tab键的焦点切换? 高手们 玩过或知道奇域嘛???真好玩的 请问pdg的文件用什么工具读呀 为什么我的菜单在win98下不能显示(高分求教) 请问如何分析Turbo Vision的源代码? 为什么我的vc6.0总是安装不成功? 工作怎么这么难找! 微软专家:Remote Data Service的底层是否依赖于DCOM或RPC? 应用程序当前实例的句柄是什么意思?(winmain函数的两个问题) mysql数据库导入的问题,求教了新手 如何将剪切板的内容粘贴到另一个进程的Edit中?
CString UserName = dlg.m_UserName;
这样就行了,点击OK后,其中m_UserName是你的登陆对话框的成员变量;这样 你的用户名就保存在UserName中了
myLoginDlg.UpdateData(TRUE);
theApp.m_sUserName = myLoginDlg.m_userName;
theApp.m_sPassWord = myLoginDlg.m_passWord;
if(okOrCan==IDOK)
点击OK就崩了;
CDialog默认的OnOK函数会在退出前调用UpdateData,见CDialog::OnOK()的原型函数void CDialog::OnOK()
{
if (!UpdateData(TRUE))
{
TRACE(traceAppMsg, 0, "UpdateData failed during dialog termination.\n");
// the UpdateData routine will set focus to correct item
return;
}
EndDialog(IDOK);
}
因此直接使用即可if(myLoginDlg.DoModal()==IDOK)
{
theApp.m_sUserName = myLoginDlg.m_userName;
theApp.m_sPassWord = myLoginDlg.m_passWord;
}
if(IDOK==myLoginDlg.DoModal())
{
myLoginDlg.UpdateData(TRUE);
theApp.m_sUserName = myLoginDlg.m_userName;
theApp.m_sPassWord = myLoginDlg.m_passWord;
}
或者直接响应EN_CHANGE消息
{
okOrCan=myLoginDlg.DoModal();
// myLoginDlg.UpdateData(TRUE);
if(okOrCan==IDOK)
{
if(myLoginDlg.m_passWord==1 && myLoginDlg.m_userName==2)//加入判断用户名密码是否正确
{
theApp.m_sUserName = myLoginDlg.m_userName;
theApp.m_sPassWord = myLoginDlg.m_passWord;
// myLoginDlg.DestroyWindow();
isRight = FALSE;
}
}
else
{
isRight = FALSE;
::PostQuitMessage(0);
// MessageBox(myLoginDlg.m_hWnd,"输入有误","err:",0);
}
}
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_LBUTTONDOWN )
{
CRect rectOk,rectCel;
m_btnOk.GetWindowRect(&rectOk);
m_btnCancel.GetWindowRect(&rectCel);
CPoint point;
GetCursorPos(&point);
if(rectOk.PtInRect(point))
{
UpdateData(TRUE);
if(m_userName.IsEmpty() || m_passWord.IsEmpty())
{
MessageBox("用户名或密码不能为空");
return FALSE;
}
m_times++;
if(m_userName== "1" && m_passWord=="2")
{
theApp.m_sUserName = m_userName;
theApp.m_sPassWord = m_passWord;
CDialog::OnOK();
}
else
{
if(m_times == 3)
{
MessageBox("密码不正确已达3次,系统将自动退出!");
CDialog::OnCancel();
::PostQuitMessage(0);
}
else
{
CString str ;
str.Format("用户名或密码不正确,您还可以输入%d次!",3 - m_times);
MessageBox(str);
m_userName = "";
m_passWord = "";
UpdateData(FALSE);
}
}
}
if(rectCel.PtInRect(point))
{
::PostQuitMessage(0);
CDialog::OnCancel();
}
}
return CDialog::PreTranslateMessage(pMsg);
}
我重写了PreTranslateMessage(MSG* pMsg)
这个函数解决的。