https://stackoverflow.com/users/893/greg-hewgill的答案是正确的。
不过看了他和https://stackoverflow.com/users/188326/solotim的后续讨论,感觉还是有进一步澄清的空间,用散文和一些伪代码的方式。
我将使用事实清单处理散文部分:
- 在模态活动完成之前,主消息循环不会运行
- 但是,在模态活动运行时仍会传递事件
- 这是因为模态活动中有一个嵌套的事件循环。
到目前为止,我只是重复了格雷格的回答,为了连续性,请多多包涵。下面是我希望提供更多有用信息的地方。
- 嵌套事件循环是 GUI 工具包的一部分,因此,它知道与存在的每个窗口相关的回调函数
- 当嵌套事件循环引发事件(例如指向主窗口的重绘事件)时,它会调用与该事件关联的回调函数。请注意,此处的“回调”可能指的是面向对象系统中表示窗口的类的方法。
- 回调函数执行所需的操作(例如,重新绘制),并立即返回嵌套消息循环(模态活动中的那个)
最后但同样重要的是,这里的伪代码希望能进一步说明,使用虚构的“GuiToolkit”:
void GuiToolkit::RunModal( ModalWindow *m )
{
// main event loop
while( !GuiToolkit::IsFinished() && m->IsOpen() )
{
GuiToolkit::ProcessEvent(); // this will call
// MainWindow::OnRepaint
// as needed, via the virtual
// method of the base class
// NonModalWindow::OnRepaint
}
}
class AboutDialog: public ModalWindow
{
}
class MainWindow: public NonModalWindow
{
virtual void OnRepaint()
{
...
}
virtual void OnAboutBox()
{
AboutDialog about;
GuiToolkit::RunModal(&about); // blocks here!!
}
}
main()
{
MainWindow window;
GuiToolkit::Register( &window ) // GuiToolkit knows how to
// invoke methods of window
// main event loop
while( !GuiToolkit::IsFinished() )
{
GuiToolkit::ProcessEvent(); // this will call
// MainWindow::OnAboutBox
// at some point
}
}