MFC单文档下使用非模态对话框
由于自己写的程序是自动获取桌面实时图像,所以用模态对话框导致程序出错,目前粗鄙的理解是模态对话框会让对话框所在线程暂停,当关闭对话框后才能继续操作,而非模态对话框可以不必让程序暂停。
下面记录非模态对话框的创建过程:
1 在单文档中新建一个对话框资源并生成对话框类 CRadiusDlg
2 在视图类C**view.cpp中添加对话框的头文件,并添加一个对话框类的指针变量CRadiusDlg *pModalessDlg;
3 在菜单栏添加一个用于显示对话框的菜单项,并在响应事件处,添加事件处理代码:
if(pModalessDlg==NULL) { pModalessDlg=new CRadiusDlg; // pModalessDlg->m_nRadius="100"; pModalessDlg->Create(IDD_DIALOG1,NULL);//创建非模态对话框 pModalessDlg->ShowWindow(SW_SHOW); } else pModalessDlg->SetActiveWindow();//若对话框已创建,只需要激活即可
经过以上步骤,可以在点击菜单项的时候弹出模态对话框。
接下来进行功能的设置:
a 在对话框类的头文件中加入#define WM_DIALOG WM_USER+1
b 在视图类的头文件中声明消息:
afx_msg LRESULT OnDialog(WPARAM wParam,LPARAM lParam);
在视图类的CPP文件中添加消息响应:
ON_MESSAGE(WM_DIALOG,OnDialog)
c 在对话框中分别为按钮添加消息处理函数。
当点击任一个按钮时都发送WM_DIALOG消息,响应OnDialog函数进行相应处理。
void CRadiusDlg::OnOK() { // TODO: Add extra validation here UpdateData(true); CFrameWnd* pFrame=GetParentFrame();//获得父窗口框架 CView* pView=pFrame->GetActiveView();//获得当前视图 pView->PostMessage(WM_DIALOG,IDOK);//向神图发送消息,参数为IDOK CDialog::OnOK(); } void CRadiusDlg::OnCancel() { // TODO: Add extra cleanup here //Cancel则不更新数据,直接投递消息 CFrameWnd* pFrame=GetParentFrame(); CView* pView=pFrame->GetActiveView(); pView->PostMessage(WM_DIALOG,IDCANCEL); CDialog::OnCancel(); }
d 在view.cpp中编辑消息处理函数WM_DIALOG的响应函数
LRESULT CthreadView::OnDialog(WPARAM wParam,LPARAM lParam) { switch(wParam) { case IDOK: m_para1=pModalessDlg->m_nRadius;//获得对话框编辑控件成员变量的值 pModalessDlg->DestroyWindow(); //销毁对话框窗口 delete pModalessDlg; //删除当前的非模态对话框对象 p pModalessDlg=NULL; //设置非模态对话框不存在标志 break; case IDCANCEL: pModalessDlg->DestroyWindow(); delete pModalessDlg; pModalessDlg=NULL; //break; case IDAPPLY: //保留非模态对话框 //m_para1=pModalessDlg->m_nRadius; //break; } //Invalidate() ; //刷新视图 return 0; } }
经过以上步骤,便可以将editcontrl变量的值传给全局变量m_para1。从而实现了取出非模态对话框的控件值的操作。