Windows对话框分为两类:模态对话框和非模态对话框。
模块对话框,当它弹出后,本应用程序其它窗口将不再接受用户输入,只有该对话框相应用户输入后,在对它进行相应操作退出后,其它窗口才能继续与用户交互。
非模态对话框,它弹出后,本程序其它窗口仍能相应用户输入。
模态对话框
首先先弄清楚主界面是如何显示出来的
加入本解决方案名称为Addition,则新建MFC工程时,会出现一个AdditionDlg .cpp文件,该文件中会有一个InitInstance()函数,用于完成初始化工作。
CAdditionDlg dlg; // 定义对话框类CAdditionDlg的对象dlg m_pMainWnd = &dlg; // 将dlg设为主窗口 INT_PTR nResponse = dlg.DoModal(); // 弹出对话框dlg,并将DoModal函数的返回值赋给nResponse if (nResponse == IDOK) // 判断返回值是否为OK按钮 { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) // 判断返回值是否为Cancel按钮 { // TODO: Place code here to handle when the dialog is // dismissed with Cancel }
从上述代码可以看到,首先定义一个对话框类的对象,然后将其首地址赋予m_pMainWnd,即设定主窗口
然后就是弹出对话框了,弹出对话框比较关键的一个函数,就是对话框类的DoModal()函数
CDialog::DoModal()函数的原型为:virtual INT_PTR DoModal();
返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nResult参数值。如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。
因此,可通过判断DoModal()函数的返回值,来判断按的是拿一个按钮,
比如,如果按的是OK按钮(OK按钮的消息处理函数OnBnClickedOk()中是CDialogEx::OnOK()函数),即
1 void CTipDlg::OnBnClickedOk() 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 CDialogEx::OnOK(); 5 }
而CDialogEx::OnOK()函数的返回值就是IDOK
至于OK按钮的消息处理函数名OnBnClickedOk的来源,可以参考下图,一目了然,
同理,如果是Cancel按钮,同样会有
1 void CTipDlg::OnBnClickedCancel() 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 CDialogEx::OnCancel(); 5 }