什么是模态弹出,是指某个函数会弹出显示并要求用户响应操作才会返回的调用。例如有快捷菜单的弹出,模态对话框的弹出,消息提示框的弹出等等这些,一直等待着用户输入的界面元素,输入焦点会一直挂着,直到用户响应,结束了模态调用过程。因为此时界面线程是阻塞在模态调用过程中,主消息循环不会执行到,而阻塞在模态自身的消息循环中。因此被称作模态。
那么什么又被称作拟模态框,很简单,只是使用户觉得这是个模态对话。而实际却只是普通窗口或非模态对话框。有两种可行方式模拟,一个种仿模态过程,在在弹出显示的调用中也实现自身消息循环,不过这样也要求你实现相应结束消息循环的接口。无论是模态对话还是弹出菜单也好,我们可以看到API都有EndDialog或EndMenu两个函数,用以结束自身的消息循环。另一种是简单较常用的方法,就是在弹出拟模态窗口时,把主窗口给禁用这样用户的输入焦点就不可能转到主窗口上,而通过拟模态操作完毕才激活主窗口。这样也就实现了模拟模态对话。
下面我们该讨论的就是,出现这两种东西各自有什么优劣呢?很显然的,拟模太若是把主窗口给禁用了,在多窗口界面逻辑复杂的程序中容易出现界面被锁不可操作的问题,设计者必须考虑周全禁用与激活的逻辑。而使用真实模态对话没有这种事情。但既然有了拟模态,那肯定必然是有其用处的,因为使用模态的话,每次都弹出都需要重新创建对话框,完成对话并销毁对话框,如果这类对话很频繁,于是人们就想到找出一种优化方案以节省系统开销,所以拟拟模态窗出现了。
是的,创建了拟模态窗只需要一次,后续只直弹出显示即可,省去系统为我们做过多不必要的事情。因为他是普通窗口罢,所以不会阻塞界面主消息循环。