关于onok函数

deng105506 2008-11-05 09:13:01
我的Dialog控件框中有4个edit子控件,我想在onok中获得这4个控件的值(子控件的值在程序运行后,用户输入获得),获得其中2个后与另一个Dialog控件框的2个edit值进行比较。可是在编写的过程中,总是出现问题:比如检验onok函数是否获值
void CXINXI::OnOK()
{
// TODO: Add extra validation here
CXINXI L;
if(L.DoModal()==IDOK)
if(L.m_XUEHAO.Compare("030520127")!=0)
AfxMessageBox("学号不正确!");
else if (L.m_JMIMA.Compare("1")!=0)
AfxMessageBox("密码不正确!");
else if (L.m_XMIMA.Compare(L.m_QMIMA)!=0)
AfxMessageBox("重复密码不正确!");
else
{
AfxMessageBox("ok!");
CDialog::OnOK;
}
}
执行后,总是学号不正确。请各位帮忙。
还有我想从一个模态对话框中获得它的edit子控件的值,不知道怎么才能传递到目前的onok函数中来。
本人初学,请举例解答,谢谢。
...全文
325 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
deng105506 2008-11-08
我做出来了,和大家分享下。
假设我建立的工程是a
先在a.h中添加如下代码:
class CAApp : public CWinApp
{
public:
CAApp();
CString a,b; //注意这是自己添加的,其他系统生成(本代码其他可不看)
// Overrides
// ClassWizard generated virtual function overrides

再在a.cpp中添加如下代码:
extern CString a,b;
放在a.cpp的开头几行就可以,具体地方无所谓
我在a.cpp中用到了a,b
如下
// The main window has been initialized, so show and update it.
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();

CXIUGAI L;
if(L.DoModal()==IDOK)
{
if(L.m_XUEHAO<"030520101"||L.m_XUEHAO>"030520130")
{

AfxMessageBox("学号输入错误,确定后退出!");
return FALSE;
}
else if(L.m_MIMA!=L.m_XUEHAO)
{
AfxMessageBox("密码输入错误,确定后退出!");
return FALSE;
}
}
else return FALSE;
a=L.m_XUEHAO; //存储模态变量的值
b=L.m_MIMA;
return TRUE;
}
这样a,b就是全局变量了,在另一个对话框的XINXI.cpp中添加如下代码
void CXINXI::OnOK()
{
// TODO: Add extra validation here

UpdateData(TRUE);
if(strcmp(m_XUEHAO,((CAApp *)AfxGetApp())->a)!=0) //注意a,b在这里出现了,要通过a,b前面这么长一段代码才能精确的调用已经存在的a,b值(前已赋值)
AfxMessageBox("学号不正确!");
else if (strcmp(m_JMIMA,((CAApp *)AfxGetApp())->b)!=0)
AfxMessageBox("密码不正确!");
else if (strcmp(m_XMIMA,m_QMIMA)!=0)
AfxMessageBox("重复密码不正确!");
else
{
AfxMessageBox("ok!");
CDialog::OnOK();
}
}
这里onok是自己建立的,可以修改
希望这篇讨论能对初学mfc的同学有帮助,另外多找专家问问,看看人家怎么做的,对学习有很大帮助
回复
Longinc 2008-11-07
帮顶
回复
deng105506 2008-11-07
CXINXI L;
if(L.DoModal()==IDOK)
这个我是用来检验在主函数a.cpp中用到的L.DoModal(),在onok中是否能用,在写代码的时候我发现这个不行,可能是删除后没保存.
其实onok已经可以实现确定的功能,无需调用domodal()
回复
deng105506 2008-11-07
正常了,谢谢各位的帮忙。
还有一个问题:我建的是多文本exe,对于两个Dialog,因为第1个是模态Dialog我设置了两个全局变量a[9],b[100]在a.cpp(a为工程名).
部分程序如下://a.cpp
// The main window has been initialized, so show and update it.
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();

UpdateData(TRUE);
CXIUGAI L;

if(L.DoModal()==IDOK)
{
if(L.m_XUEHAO<"030520101"||L.m_XUEHAO>"030520130")
{

AfxMessageBox("学号输入错误,确定后退出!");
return FALSE;
}
else if(L.m_MIMA!=L.m_XUEHAO)
{
AfxMessageBox("密码输入错误,确定后退出!");
return FALSE;
}
}
else return FALSE;
CString a=L.m_XUEHAO;
CString b=L.m_MIMA;
return TRUE;
}
在另外一个对话框中的onok中我输入如下:
//XINXI.cpp
void CXINXI::OnOK()
{
// TODO: Add extra validation here

UpdateData(TRUE);

if(strcmp(m_XUEHAO,a)!=0)
AfxMessageBox("学号不正确!");
else if (strcmp(m_JMIMA,b)!=0)
AfxMessageBox("密码不正确!");
else if (strcmp(m_XMIMA,m_QMIMA)!=0)
AfxMessageBox("重复密码不正确!");
else
{
AfxMessageBox("ok!");
CDialog::OnOK();
}
}
结果它不识别a和b,是不是引用它们时,有什么要注意的?
回复
rcbblgy 2008-11-07
CXINXI L;
if(L.DoModal()==IDOK)

楼主这个是想干吗呢??实便化然后产生对话框??去掉这两句试试。



还有我想从一个模态对话框中获得它的edit子控件的值,不知道怎么才能传递到目前的onok函数中来。

和现在这个一样,在那个对话框所在类(假设这个类名为Class)的OnOK函数中先UpdateData(TRUE)下,这样那两个edit控件的成员变量就有值了。然后在要比较的地方实例化一下Class这个类,再访问它的两个成员函数就行了。
回复
xuedaoli 2008-11-06
你给控件添加的是什么变量的类型:
比如当前的控件是CEdit类型,要获取这个控件里面的内容


UpdateData(TRUE);
把控件的值传给对应的变量。

UpdateData(FALSE);
把变量的值传递给控件。




一个CEdit控件(ID为IDC_EDIT)


UpdateData(TRUE); //先更新

方法1。(Control)控件变量类型
CString str;
GetDlgItemText(IDC_EDIT,str);

str就是你要的内容。

方法2。一般类型(int,string等)
CString editstr;
editstr就是你的内容

还有就是要注意,GetDlgItemText获得的是CString类型的结果,如果你要的是其他的类型的话还要转换,比如整形

所有建议你使用方法2,比较方便,直接定义相应的数据类型
回复
deng105506 2008-11-06
还是不行,同样是学号出错。我想还是先把其他部分搞好了,有时间了再慢慢做这部分。谢谢了!
回复
rcbblgy 2008-11-05
在OnOK函数的开始加上UpdateData(TRUE)试试。
回复
rcbblgy 2008-11-05
给每个控件添加成员变量,然后用UpdateData(TRUE)
回复
相关推荐
发帖
C++ 语言
创建于2007-09-28

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2008-11-05 09:13
社区公告
暂无公告