第六节 模态与非模态对话框的创建
模态对话框指的是创建的对话框只能在这个窗口操作,而不能往父窗口或其他地方操作.
非模态对话框则没有这个限制.
用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释放内存。动态内存的生存期由我们决定,
使用非常灵活,但问题也最多。