MFC子对话框数据传父对话框(模式对话框)

 

1.使用应用程序向导创建对话框MFC程序。 
2.使用资源在主界面添加按钮,"IDC_CREATE_DIALOG"用来创建模态对话框。
3.在资源视图中添加对话框id为IDD_MODAL_DIALOG.
4.为这个对话框添加基于CDialog类的CMyModalDialog类。
5.为IDC_CREATE_DIALOG添加响应,代码如下。

CMyModalDialog dlg;
dlg.DoModal();

---------------------------------------------------------------------

在主对话框中调用子对话框并赋值一个CStatic。。

CDoubleParaDlg dlg;
// dlg.Create(IDD_DIALOG_DOUBLE,this);
dlg.m_prompt.SetWindowText("please input x:");
dlg.DoModal();
弄漂亮的一段话,但是出错了。

弹出DEBUG error,错误在winocc.cpp某行,我到那一看,发现是一个IsWindow的ASSERT宏。

也就是说,调用SetWindowText的时候,他的宿主,m_prompt不是窗体咯?但是他是窗体。

只是,还米有创建,之前一直认为创建新的对话框对象,也就是CDoubleParaDlg dlg的时候,窗体上的控件都被创建了,这次不禁生出疑问,

然后,事实上,对话框的控件一般是在OnInitDialog函数中进行创建的,这个时侯我们只需要测试一下OnInitDialog函数什么时候执行就OK,加一个MessageBox之后发现,,,,

OnInitDialog函数是在DoModal后创建的,也就是说,Domodal后,对话框上的控件才被创建,囧,但是模式对话框,domodal后,主窗体是被阻塞的,那怎么操作上面的控件呢,,囧。。。。

google了下后发现,模态对话框是不能在domodal前操作对话框上面的控件的。

诶,囧,米办法了,硬的不行来软的,可以在目标dlg类中设定一系列public的成员变量,作为操作控件的参数,然后在主对话框中对那些参数变量赋值,然后再在子对话框的OnInitDialog里面读取那些参数完成操作

比如本例可改为

主对话框中:

CDoubleParaDlg *dlg = new CDoubleParaDlg;
dlg.para1 = "please input x:";
dlg.para2 = "please input y:";
dlg->DoModal();

 

然后在子对话框中

BOOL CDoubleParaDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
m_prompt1.SetWindowText(para1);
m_prompt2.SetWindowText(para2);
return TRUE; // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}

你可能感兴趣的:(MFC子对话框数据传父对话框(模式对话框))