例子,在单文档程序窗口中绘制圆,通过调出非模态对话框设置半径值。(画圆部分省略)
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;
}