阅读:1032回复:10
各位少侠,看一下关于MFC的小疑问
我刚才偷窥了一下CDialog::DoModal()的实现代码,我发现它是用CreateDialogIndirect创建一个modaless的对话框,然后它自己死循环处理消息,模拟阻塞的modal对话框。
我的疑问是,为啥它不用DialogBoxIndirect直接创建modal对话框啊,它为啥要自己处理消息啊,它这样做有什么深层次需要吗? 哪位熟悉MFC的少侠说说。 [编辑 - 12/3/02 by VanCheer] |
|
|
沙发#
发布于:2002-12-03 13:47
因为它对对话框上的各种消息进行处理,所以要做一个消息驱动,如果要了解详细的去翻一下候捷的mfc深入浅出
|
|
板凳#
发布于:2002-12-03 14:14
因为它对对话框上的各种消息进行处理,所以要做一个消息驱动,如果要了解详细的去翻一下候捷的mfc深入浅出 我粗略看了一下代码,没发现它处理自己什么消息。 深入前出我略微翻了一下,没看到。 |
|
|
地板#
发布于:2002-12-03 14:16
对于微软的东西,不要问太多的为什么。
你可以做一个试验,把模式对话框的创建 放到应用程序初始化的那个函数中,你就 会发现早在程序的message queue创建之前 这个模式对话框就可以处理消息了,这个 能力显然是他自己带的。至于微软为什么 要这样实现,who knows. |
|
地下室#
发布于:2002-12-03 14:20
另外一个事实是
在纯用api编windows程序的应用中 你必须为每一个窗口注册消息处理函数 这样也就可以理解为什么对话框 自己会带一个消息循环了 |
|
5楼#
发布于:2002-12-03 14:26
另外一个事实是 用DialogBoxIndirect创建的对话框,也可以有消息函数,它一出来就是模式(阻塞)的,不像CreateDialogIndirect那样需要自己处理消息阻塞 |
|
|
6楼#
发布于:2002-12-03 14:30
用哪个函数来创建对话框不是关键
他们只是途径和使用的资源不同而已 |
|
7楼#
发布于:2002-12-03 14:37
pop出一个模式对话框,不就是在一个消息处理函数中做的么?
如果模式对话框还没有结束,对于单线程的程序来说,其他函数 就不可能被调用了。 所以了,对话框就只好自己处理消息了。 也不知偶得理解对不对? |
|
8楼#
发布于:2002-12-03 14:58
你可以这样理解,但这肯定不是
微软采用这种办法的原因。我也 想过这个问题,既然可以有消息 泵将程序的消息分发给视图,框架, 文档(实际上文档只接受命令), 那肯定也可以让他把消息发给子 窗口,微软没有这样做,我猜是应为 这样多了一道工序,而不如直接 处理来的简洁,而视图,框架,文档 就不同了,因为他们本身是程序框架 的一部分,每个程序都会有,因此 不会增加额外开销。 不过,这仅仅是我的猜想而已。 |
|
9楼#
发布于:2002-12-03 17:53
用哪个函数来创建对话框不是关键 不很一样 DialogBoxIndirect创建的是模式对话框,天生就是阻塞的,不必自己死循环阻塞 |
|
|
10楼#
发布于:2002-12-03 18:52
引用:
-------------------------------------------------------------------------------- 不很一样 DialogBoxIndirect创建的是模式对话框,天生就是阻塞的,不必自己死循环阻塞 -------------------------------------------------------------------------------- 你从哪里看到的阿?下面是msdn里面的原话: The CreateDialogIndirect macro creates a modeless dialog box from a dialog box template in memory 注意:是modeless dialog. |
|
|