关于有模式和无模式对话框

做GUI用到对话框,上网查了下解释,有篇文章是对着MFC来的,说的挺好,转过来~~

非模态对话框与模态对话框相比有下列不同之处: 
非模态对话框的模板必须具有Visible风格,否则对话框将不可见,而模态对话框则无需 
设置该项风格。更保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管 
对话框是否具有Visible风格。 
非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别 
的对象中或以局部变量的形式构建在堆栈上。通常应在对话框的拥有者窗口类内声明一 
个指向对话框类的指针成员变量,通过该指针可访问对话框对象。 
通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是模态对话 
框的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个 
消息循环,这样对话框就不会垄断用户的输入。Create在显示了对话框后就立即返回, 
而DoModal是在对话框被关闭后才返回的。众所周知,在MFC程序中,窗口对象的生存期 
应长于对应的窗口,也就是说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象 
删除掉。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框 
对象的生存期,因此只好在堆中构建对话框对象,而不能以局部变量的形式来构建之。 
 
必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用C 
Wnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog 
:OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在 
函数中调用DestroyWindow来关闭对话框。 
因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符 
删除对话框对象。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是 
一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作,具体代码如下 
void CModelessDialog::PostNcDestroy 

delete this; //删除对象本身 

这样,在删除屏幕上的对话框后,对话框对象将被自动删除。拥有者对象就不必显式的 
调用delete来删除对话框对象了。 
必须有一个标志表明非模态对话框是否是打开的。这样做的原因是用户有可能在打开一 
个模态对话框的情况下,又一次选择打开命令。程序根据标志来决定是打开一个新的对 
话框,还是仅仅把原来打开的对话框激活。通常可以用拥有者窗口中的指向对话框对象 
的指针作为这种标志,当对话框关闭时,给该指针赋NULL值,以表明对话框对象已不存 
在了。

posted on 2010-04-07 20:25 轻帆向南 阅读(569) 评论(0)  编辑  收藏 所属分类: java


只有注册用户登录后才能发表评论。


网站导航:
 

导航

留言簿

随笔分类(13)

随笔档案(13)

文章分类

最新评论