第六节 模态与非模态对话框的创建

第六节 模态与非模态对话框的创建

模态对话框指的是创建的对话框只能在这个窗口操作,而不能往父窗口或其他地方操作.

非模态对话框则没有这个限制.

用MFC创建一个对话框项目,会有一个基于CDialog对话框类派生的主对话框类,现在在这个类的基础上增加一个按钮,使得可以新建一个模态或非模态对话框.

1->点击资源视图在Dialog添加一个对话框ID资源

2->在新建对话框资源添加一个类CMyDialog ,基类为CDialog 这样就有了2个对话框类了,1个是MFC工程的主对话框,1个是新建的对话框

3->选择主对话框并且画一个Button按钮 为他添加消息响应 然后进入此行代码进行处理

4->选择创建模态或非模态对话框

     模态:在Button响应函数中定义一个新建对话框资源类CMyDialog dlg用dlg.DoModal()来创建

     非模态:在Button响应函数外定义一个新建对话框资源类CMyDialog dlg.用dlg.Create(IDD_CCTRY_DIALOG, this); 第一个参数为新建资源ID,第二个参数为CMyDialog 的this指针

5->显示对话框

     模态:显示功能包含在dlg.DoModal();

     非模态:dlg.ShowWindow(SW_SHOW);具体参数参考MSDN

6->非模态对话框的后期处理,因为一旦窗口对话框类创立后,如果点击,自带的按钮退出窗口,会出现旧的窗口还没销毁,新的窗口又一次定义,这样地址会和系统声明的NULL发生冲突,所以要增加处理函数,DestroyWindow();

做法有2种,一是在新建资源ID把可能导致对话框关闭的按钮增加消息响应,加入DestroyWindow();并且要把返回代码清空例如,void CMydialog::OnBnClickedOk()
{
 // TODO: 在此添加控件通知处理程序代码
 DestroyWindow();
 //CDialog::OnOK();
}

二是在CMydialog类重写虚函数 例如void CMydialog::OnCancel()
{
 // TODO: 在此添加专用代码和/或调用基类
 DestroyWindow();
 //CDialog::OnCancel();
}

7->非模态对话框创建前期处理 重写虚函数 例如在CMydialog

BOOL CMyDialog::OnInitDialog()
{
 CDialog::OnInitDialog();

 // TODO:  Add extra initialization here
 SetDlgItemText(IDC_EDIT1, _T("hello cctry.com")); //这里就是创建之前所做工作

 return TRUE;  // return TRUE unless you set the focus to a control
 // EXCEPTION: OCX Property Pages should return FALSE
}

8->定义CMydialog的其他方法

方法 1.new CMyDialog *dlg;

dlg= new CMyDialog();

后期处理需要额外在CMydialog重写虚函数

void CMyDialog::PostNcDestroy()
{
 // TODO: Add your specialized code here and/or call the base class
 delete this;

 CDialog::PostNcDestroy();
}

方法 2.malloc CMyDialog * pDlg;

 pDlg = (CMyDialog *)malloc(sizeof(CMyDialog));
 pDlg->CMyDialog::CMyDialog();

后期处理需要额外在CMydialog重写虚函数

void CMyDialog::PostNcDestroy()
{
 // TODO: Add your specialized code here and/or call the base class
 //delete this;
 this->~CMyDialog();
 free(this);

 CDialog::PostNcDestroy();
}

9->全局变量分配在静态存储区

内存分配方式有三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个
运行期间都存在。例如全局变量,static变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执
行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率
很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的
内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,
使用非常灵活,但问题也最多。

你可能感兴趣的:(exception,存储,mfc,dialog,button,initialization)