非模态对话框与模态对话框对比

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

你可能感兴趣的:(非模态对话框与模态对话框对比)