MFC中模态对话框和非模态对话框的区别

7

您能帮我通过介绍一些优秀的教程链接,让我全面了解模态对话框与非模态对话框之间的区别吗?
例如,您能否向我解释一下这里链接的程序?它们是模态对话框还是非模态对话框?
迄今为止,我认为仅使用代码设计对话框意味着非模态,而使用工具箱设计对话框则意味着模态,但我搜索得越多,就越感到困惑。您能帮我更好地理解吗?


1
为了简单起见,模态对话框将占用应用程序的最顶层窗口焦点,直到该模态对话框关闭之前,您无法切换到其他窗体。非模态类似于浮动窗口。您使用的边框并不重要。 - Ken Cheung
MSDN上了解到:1) 模态对话框:要求用户在继续程序之前作出响应。2) 非模态对话框:保持在屏幕上,并随时可供使用,但允许其他用户活动。 - undefined
4个回答

17

模态对话框和非模态对话框的区别不仅限于MFC。

当一个模态对话框打开时,只要该模态对话框一直处于打开状态,您就不能与程序中除此模态对话框之外的任何其他内容进行交互。大多数对话框都是模态的,例如“文件另存为”对话框就是模态的。

另一方面,非模态对话框的行为就像普通窗口一样,只要它打开,您就可以做任何想做的事情。Microsoft Word中的拼写检查对话框就是这样的一个例子。

您在问题中提到的链接与模态和非模态对话框无关。

MFC中处理模态对话框很简单。

而处理非模态对话框则有些复杂,但你可以在谷歌上搜索“mfc modeless dialog tutorial”找到大量的教程。


好的,谢谢@Michael Walz。那么在运行程序之前,我如何通过查看代码来判断对话框是模态的还是非模态的呢? - Sepideh Abadpour

6

模态对话框是通过在MFC中调用您的CDialog派生类的DoModal成员函数或使用DialogBox API函数来创建的。

非模态对话框是通过在MFC中调用您的CDialog派生类的Create()(或CreateIndirect)成员函数或使用CreateDialog API函数来创建的。

上述链接还解释了支持模态和非模态对话框所需的其他操作,对于MFC,this MSDN link有更多信息。


4

模态对话框:

  • 打开模态对话框后,我们无法访问父窗口,例如:另存为、打开文件对话框。
  • 通过调用CDialog构造函数和DoModal方法,在堆栈中创建了模态对话框。
  • 通过调用EndDialog()函数关闭模态对话框,它会隐藏对话框。
  • 它挂起了父窗口的消息循环,并启动自己的消息循环。

非模态对话框:

  • After opening the modeless dialog box, we can access the parent window.
  • Modeless created by calling

    CDialog::Create(......);
    CDialog::Show Window(.....)
    

    method. And created in Heap.

  • Modeless dialog box closed by destroying the window, by calling Destroy Window().
  • It doesn't have its own message loop, it depends on parent window message loop. Parent window forwards the message to child window.

0

模态对话框: 1. 模态对话框可以在单个窗口(即)所有者窗口中进行通信。如果我们打开子窗口,直到关闭该窗口时,我们才在父窗口上进行通信。 例如:保存,另存为 2. 创建模态对话框以调用domodel() 3. 关闭时,您要调用end dialog。此对话框不会被删除,只是隐藏起来。 4. 在模态对话框中有一个子消息循环

非模态对话框: 1. 当我们打开一个窗口(所有者窗口)时,同时我们也可以与子窗口进行通信。 例如:记事本查找,字词, 2. 模态对话框的创建是调用Create window()和ShowWindow() 3. 如果要关闭该窗口,请调用destroy window 这里窗口被销毁 4. 这里的消息处理父窗口


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接