模态对话框和非模态对话框的创建弹出

一、模态对话框的创建及显示

1、Windows对话框分为两类:模态对话框和非模态对话框。

    模态对话框:当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。

非模态对话框:它弹出后,本程序其他窗口仍能响应用户输入。非模态对话框一般用来显示提示信息等。

 

2、模态对话框的弹出

①创建一个新的对话框模板。

②为创建的对话框添加类,在Solution Explorer中可以看到生成了CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp。

③为按钮添加消息处理函数OnBnClickedAddButton()。

④在AdditionDlg.cpp中包含CTipDlg的头文件:#include "TipDlg.h"。

⑤在消息处理函数OnBnClickedAddButton()的函数体中,构造CTipDlg类的对象tipDlg,并通过语句tipDlg.DoModal();弹出对话框,最后判断DoModal()函数的返回值是IDOK还是IDCANCEL来确定做何种处理。

1)如果仅仅是弹出:

CAdditionDlg dlg;  

dlg.DoModal();

2)可以通过模态对话框DoModal函数的返回值,判断用户选择了“确定”还是“取消”。注意函数返回值的类型INT_PTR

CSelectDLG dlgload;

//INT_PTR nResponse = dlg.DoModal(); 

//if (nResponse == IDOK)  

 

if(dlgload.DoModal()==IDOK)

}else

{//  

}

 



、非模态对话框的创建及显示

①创建一个新的对话框模板。

②为创建的对话框添加类,在Solution Explorer中可以看到生成了CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp。

③为按钮添加消息处理函数OnBnClickedAddButton()。

 

在AdditionDlg.h中添加#include"TipDlg.h"。

这是因为我们需要在AdditionDlg.h中定义CTipDlg类型的指针变量,所以要先包含它的头文件;

⑤然后在AdditionDlg.h中为CAdditionDlg类添加private成员变量CTipDlg *m_pTipDlg【类指针】

注意:以前的指针大都是 int *pt1等  int为一种类型。这里CTipDlg为一种类,指向类的指针。

⑥在CAdditionDlg类构造函数体中添加m_pTipDlg = NULL;

在任何指针变量使用前都初始化,可以避免因误访问重要内存地址而破坏此地址的数据。

⑦修改CAdditionDlg::OnBnClickedAddButton()函数如下:

1. // 如果指针变量m_pTipDlg的值为NULL,则对话框还未创建,需要动态创建   

2.     if (NULL == m_pTipDlg)  

3.     {   

4.         // 创建非模态对话框实例   

5.         m_pTipDlg = new CTipDlg();   //动态创建对象

6.         m_pTipDlg->Create(IDD_TIP_DIALOG, this);   

7.     }   

8.     // 显示非模态对话框   

9.     m_pTipDlg->ShowWindow(SW_SHOW);  

10.   

⑧、.因为此非模态对话框实例是动态创建的,所以需要手动删除此动态对象来销毁对话框。我们在CAdditionDlg类的析构函数中添加删除代码,但是MFC并没有自动给出析构函数,这时需要我们手动添加,在对话框对象析构时就会调用我们自定义的析构函数了。在AdditionDlg.h文件中为CAdditionDlg添加析构函数声明:~CAdditionDlg();,然后在AdditionDlg.cpp文件中添加析构函数的实现,函数体如下:

1. CAdditionDlg::~CAdditionDlg()   

2. {   

3.     // 如果非模态对话框已经创建则删除它   

4.     if (NULL != m_pTipDlg)  

5.     {   

6.         // 删除非模态对话框对象   

7.         delete m_pTipDlg;   

8.     }   

9. }  


 

你可能感兴趣的:(MFC)