如何在主对话框中的函数中获取到非模态对话框中的控件中的值? 本帖最后由 VisualEleven 于 2012-12-02 20:52:45 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的CSetAlam类的OnInitDialog函数中调用OnBnClickedOK()函数? 不是在OnInitDialog里边调用的,OnBnClickedOK是“确定”按钮的命令响应函数,点击“确定”的时候调用它。 其实程序中是有问题的,我觉得你不能创建非模态对话框,因为创建非模态对话框就好比是创建了另一线程,并行运行,你还没按OK,OnSetalam()主对话框就执行完了.你试一下如下方案:CSetAlam psetAlam;if(psetAlam.DoModal==IDOK){}psetAlam ->Create(IDD_SETALAM, NULL ); psetAlam ->ShowWindow(SW_SHOW);//创建的是非模态对话框 不好意思,刚才出了点错其实程序中是有问题的,我觉得你不能创建非模态对话框,因为创建非模态对话框就好比是创建了另一线程,并行运行,你还没按OK,OnSetalam()主对话框就执行完了.你试一下如下方案:CSetAlam psetAlam;ALARM *palarm = NULL;if(psetAlam.DoModal==IDOK){ palarm = psetAlam ->GetAlarm();}然后再执行下面的代码,为了成功,最好高GetAlarm()为public类型.先试试吧,不行再说,自己的一点看法 两个对话框是一个进程还是两个进程?一个进程 可以互传指针或者消息两个进程 可以用WM_COPYDATA消息,管道,socket之类的方法通信 你的GetAlarm()是对话框的一个方法吧.CSetAlam psetAlam;ALARM *palarm = NULL;if(psetAlam.DoModal==IDOK){ palarm = psetAlam.GetAlarm();}大括号中用.来进行访问试一下,你把错误说清楚些. 不要用非模态对话框来创建你的CSetAlam!因为一旦创建为非模态形式的话,当然你的主程序函数void CAlarmClockDlg::OnSetalam() 不会等待你在CSetAlam对话框中设置的目标时间,就直接跑完了,原因就是他们不在同一个线程内。改为用“模态对话框domodle”来生成CSetAlam,当这个子对话框产生后,整个程序处于堵塞状态,只要你不点击“OnBnClickedOk()”,程序会已知等待。 我想,既然是两个线程,我可不可以进行线程间通信。就是在void CSetAlam::OnBnClickedOk() { //获取组合框中的文本 this->GetDlgItemTextW(IDC_HOUR, m_pAlarm->csHour);//获取时间 this->GetDlgItemTextW(IDC_MINITE, m_pAlarm->csMinite);//获取分钟 CDialogEx::OnOK(); } 这个函数里边,向主线程发送一条自定义消息。然后在CAlarmClockDlg类里边写这个自定义消息函数,再在不这个函数里边创建一个子线程,最后在线程函数里边接受执行void CSetAlam::OnBnClickedOk() 的时候所设置的控件里边的值。 其实,你就想值传递而已,不行,设置外部变量,用extern来做 CSetAlam SetDlg;//全局变量。void CAlarmClockDlg::OnSetalam(){ // TODO: 在此添加命令处理程序代码 if(SetDlg.DoModal() == IDOK) { m_hThread = ::CreateThread(NULL, 0, ThreadAlarm, this, 0, NULL);//创建一个线程 }}为什么我设置断点调试的时候发现CSetAlam 的HwND是0x00000000呢? Vc中位图无法显示 请问:web的电子签章,是否有参考代码 VS2005和VC6.0的区别 利用管道与Ping.exe通信,发现阻塞 怎么用代码设置一对话框的大小? 关于INI文件操作的奇怪现象 在窄带进行大数据量传输时,发送速率控制的问题 如何把工具条显示和隐藏而不出错,在线等待 谁能详细介绍一下SDI程序的视图分割,按照书上写的都不行,一运行就出错。帮忙!!! 请问如何呼出拨号联接对话框? C#中关于多线程的问题。。(小弟新手) 类的组合怎么用
CSetAlam psetAlam;
if(psetAlam.DoModal==IDOK)
{}psetAlam ->Create(IDD_SETALAM, NULL ); psetAlam ->ShowWindow(SW_SHOW);//创建的是非模态对话框
其实程序中是有问题的,我觉得你不能创建非模态对话框,因为创建非模态对话框就好比是创建了另一线程,并行运行,你还没按OK,OnSetalam()主对话框就执行完了.你试一下如下方案:CSetAlam psetAlam;
ALARM *palarm = NULL;
if(psetAlam.DoModal==IDOK)
{
palarm = psetAlam ->GetAlarm();
}
然后再执行下面的代码,为了成功,最好高GetAlarm()为public类型.先试试吧,不行再说,自己的一点看法
两个进程 可以用WM_COPYDATA消息,管道,socket之类的方法通信
CSetAlam psetAlam;
ALARM *palarm = NULL;
if(psetAlam.DoModal==IDOK)
{
palarm = psetAlam.GetAlarm();
}
大括号中用.来进行访问试一下,你把错误说清楚些.
因为一旦创建为非模态形式的话,当然你的主程序函数void CAlarmClockDlg::OnSetalam() 不会等待你在CSetAlam对话框中设置的目标时间,就直接跑完了,原因就是他们不在同一个线程内。
改为用“模态对话框domodle”来生成CSetAlam,当这个子对话框产生后,整个程序处于堵塞状态,只要你不点击“OnBnClickedOk()”,程序会已知等待。
我想,既然是两个线程,我可不可以进行线程间通信。就是在
void CSetAlam::OnBnClickedOk() { //获取组合框中的文本
this->GetDlgItemTextW(IDC_HOUR, m_pAlarm->csHour);//获取时间
this->GetDlgItemTextW(IDC_MINITE, m_pAlarm->csMinite);//获取分钟 CDialogEx::OnOK();
}
这个函数里边,向主线程发送一条自定义消息。然后在CAlarmClockDlg类里边写这个自定义消息函数,再在不这个函数里边创建一个子线程,最后在线程函数里边接受执行void CSetAlam::OnBnClickedOk() 的时候所设置的控件里边的值。
CSetAlam SetDlg;//全局变量。
void CAlarmClockDlg::OnSetalam()
{
// TODO: 在此添加命令处理程序代码 if(SetDlg.DoModal() == IDOK)
{
m_hThread = ::CreateThread(NULL, 0, ThreadAlarm, this, 0, NULL);//创建一个线程
}
}
为什么我设置断点调试的时候发现CSetAlam 的HwND是0x00000000呢?