int nResponse = dlg.DoModal();一句使你的整个程序都在DoModal()内部进行。而且,你退出DoMal()时[你一定结束了你的对话框],InitInstance返回的是False,我们知道,这样,CwinThread::Run是不会执行的。
但对话框程序是在哪里进行消息处理的呢。
原来,dlg.DoModal()内部会调用CwinThread::RunModalLoop,它起到的作用和RUN()是一样的[当然内部有细小差别,请参考MSDN]!!!
第二种情况,你是在SDI[或其它]程序中调用Dlg.DoModal() 产生了一模式对话框[有父窗口].
这又是如何运作的呢?
建了这样一个工程做为例子。
SDI,在View中处理LBUTTONDOWN:
MyDLg.DoModal();
MyDLg内有按钮,以惫后用.
没有显示模式对话框前,消息处理一直在Cthread::Run()中进行.
你单击后,程序执行点进入DoModal()内部的RunModalLoop,这又是一个消息处理机制.
不过DoModal()中调用RunModalLoop,前会Disable掉它的父窗口.从RunModalLoop中出来后,再 Enable它.
模式对话框和非模式对话框都是通过调用CreateDialogIndirect()产生创建对话框.那它和非模式对话框区别是什么造成的呢?
1 模式对话框将父窗口DISABLE掉.
我原以为被Disable的窗口是不接收消息的.但后来我马上发现我是错的.但,为什么你对被Disable的窗口进行KeyBorad,Mouse动作时,窗口没反映呢,我想,这可能是操作系统从中搞的鬼.我在本文一开始,就写出操作系统向窗口发送消息的过程,我想当它发现目标窗口处理Disabled状态时,不会将消息发送给它,但这不能说窗口不接收消息,其它程序[或它本身]发送给它的消息还是可以接收并处理的.
2 模式对话框本身有消息处理机制 RunModalLoop.
对以上两点加以实验.
我在我的刚才建的项目中的模式对话框中加上一个BUTTON,其中加入如下代码:
OnButton1()
{
GetParaent()->EnableWindow(1);
}
单击,后我们发现,此时它已经不再表现为”模态”,我试着点击菜单,还是会作出正常反映.
我想这此消息[对于父窗口的,如:菜单动作]的处理也应是在模式对话框中的RunModalLoop中进行处理的吧[这点我不能确定].
先写到这里吧,一点浊见.请大家批评.