非模态对话框的使用

例子,在单文档程序窗口中绘制圆,通过调出非模态对话框设置半径值。(画圆部分省略)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值