例子,在单文档程序窗口中绘制圆,通过调出非模态对话框设置半径值。(画圆部分省略) 1、新建单文档应用程序,添加一个对话框资源,并创建对话框类CRadiusDlg。 2.在视图类头文件中加入刚创建的对话框类的头文件,#include"RadiusDlg.h",并添加一个对话框类的指针变量,CRdiusDlg *pModalessDlg; 3.在菜单栏中添加一个用于显示对话框的菜单项,并为其添加命令函数,添加代码: if(pModallessDlg==NULL) { pModallessDlg=new CRadiusDlg; //pModallessDlg->m_nRadius=100; //设置编辑框控件变量的初始值 pModallessDlg->Create(IDD_RADIUS_DLG,NULL);//创建非模态对话框 pModallessDlg->ShowWindow(SW_SHOW); //显示非模态对话框 } else pModallessDlg->SetActiveWindow();//若对话框已创建,只需要激活即可 运行,点击即可显示非模态对话框。下面添加对具体的应用。 4、在刚才创建的对话框中再添加一个按钮“应用”,ID为IDAPPLY。现在对话框上共三个按钮,“确定”,“取消”和“应用”,我们要添加一个消息WM_DIALOG,为下面点击时按钮服务。 a、在对话框类的头文件中加入#define WM_DIALOG WM_USER+1。 b、在视图类的头文件中声明消息WM_DIALOG,afx_msg LRESULT OnDialog(WPARAM wParam,LPARAM lParam); 在CPP文件中添加消息响应,ON_MESSAGE(WM_DIALOG,OnDialog)。 5、在对话框中分别为三个按钮添加消息处理函数。i当点击任一个按钮时都发送WM_DIALOG消息,响应OnDialog函数进行相应处理。 void CInputDlg::OnOK() { // TODO: Add extra validation here UpdateData(true); CFrameWnd* pFrame=GetParentFrame();//获得父窗口框架 CView* pView=pFrame->GetActiveView();//获得当前视图 pView->PostMessage(WM_DIALOG,IDOK);//向神图发送消息,参数为IDOK CDialog::OnOK(); } void CInputDlg::OnCancel() { // TODO: Add extra cleanup here //Cancel则不更新数据,直接投递消息 CFrameWnd* pFrame=GetParentFrame(); CView* pView=pFrame->GetActiveView(); pView->PostMessage(WM_DIALOG,IDCANCEL); CDialog::OnCancel(); } void CInputDlg::OnApply() { // TODO: Add your control notification handler code here UpdateData(true); CFrameWnd* pFrame=GetParentFrame(); CView* pView=pFrame->GetActiveView(); pView->PostMessage(WM_DIALOG,IDAPPLY); } 6、编辑消息处理函数WM_DIALOG的响应函数: LRESULT CModallessView::OnDialog(WPARAM wParam,LPARAM lParam) { switch(wParam) { case IDOK: m_nCViewRadius=pModallessDlg->m_nRadius;//获得对话框编辑控件成员变量的值 pModallessDlg->DestroyWindow(); //销毁对话框窗口 delete pModallessDlg; //删除当前的非模态对话框对象 pModallessDlg=NULL; //设置非模态对话框不存在标志 break; case IDCANCEL: pModallessDlg->DestroyWindow(); delete pModallessDlg; pModallessDlg=NULL; break; case IDAPPLY: //保留非模态对话框 m_nCViewRadius=pModallessDlg->m_nRadius; break; } Invalidate(); //刷新视图 return 0; } |