非模态对话框

模态对话框:


1、 在资源里新建对话框


2、 class wizard 新建相应的对话框类,继承于CDialog类


3、 在相应的响应函数中添加如下代码(别忘记包含类的头文件):

CXXXDialog XXX;
XXX.DoModal();

DoModal()表示创建模态对话框,
modal (模态的) 


4、Note: 

     MFC菜单需要注意的是,菜单有两个,一个是空框架下的,一个是有文档下的,因此要注意响应函数函数的位置,比如,如果响应函数是在View下面,那么在空框架下菜单项按钮就是灰色的,不能操作。

非模态对话框:


要用到基类的create函数,为了防止对象生命周期的结束而结束对话框,采用指针。

CDialog1 *DIA = new CDialog1;
DIA->Create(IDD_DIALOG1,this);
DIA->ShowWindow(SW_SHOW);

非模态对话框不同于模态对话框,非模态对话框需要销毁。

在派生对话框类中,重写以下两个函数,销毁窗口。

void CTestDlg::OnCancel()
{
     DestroyWindow();
}


void CTestDlg::OnOk()
{
     DestroyWindow();
}


在派生对话框类中,重写以下函数,释放指针。
void CTestDlg::PostNcDestroy()
{
     CDialog::PostNcDestroy();
     delete this;
}

MSDN原文:

When   you   implement   a   modeless   dialog   box,   always   override   the   OnCancel  member   function   and   call   DestroyWindow   from   within   it.   Don’t   call   the  base   class   CDialog::OnCancel,   because   it   calls   EndDialog,   which   will   make  the   dialog   box   invisible   but   will   not   destroy   it.   You   should   also  override   PostNcDestroy   for   modeless   dialog   boxes   in   order   to   delete   this,  since   modeless   dialog   boxes   are   usually   allocated   with   new.   Modal   dialog  boxes   are   usually   constructed   on   the   frame   and   do   not   need   PostNcDestroy  cleanup.


判断非模态对话框是否关闭:


在所属类中设置改对话框的指针成员变量,初始化为NULL

对话框类中设置成员变量 view指针;

对话框销毁时,view类的成员变量指针设为NULL;

这样,当该指针为NULL时,表示对话框已关闭。


问题:想尝试用发送消息的方式,为什么在对话框类里面GetParent()出错;GetParent()得到的是什么?


2014、5、22

从CDialogEx继承的模态对话框在点击对话框区域外时,没有声音和闪烁提醒,(为什么?)

从CDialog继承就可以了。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值