VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1032回复:10

各位少侠,看一下关于MFC的小疑问

楼主#
更多 发布于:2002-12-03 12:44
我刚才偷窥了一下CDialog::DoModal()的实现代码,我发现它是用CreateDialogIndirect创建一个modaless的对话框,然后它自己死循环处理消息,模拟阻塞的modal对话框。
我的疑问是,为啥它不用DialogBoxIndirect直接创建modal对话框啊,它为啥要自己处理消息啊,它这样做有什么深层次需要吗?
哪位熟悉MFC的少侠说说。

[编辑 -  12/3/02 by  VanCheer]
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
glqgglq
驱动小牛
驱动小牛
  • 注册日期2001-04-16
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-03 13:47
因为它对对话框上的各种消息进行处理,所以要做一个消息驱动,如果要了解详细的去翻一下候捷的mfc深入浅出
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-03 14:14
因为它对对话框上的各种消息进行处理,所以要做一个消息驱动,如果要了解详细的去翻一下候捷的mfc深入浅出

我粗略看了一下代码,没发现它处理自己什么消息。
深入前出我略微翻了一下,没看到。
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
hfyhl
驱动小牛
驱动小牛
  • 注册日期2002-11-08
  • 最后登录2005-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-03 14:16
对于微软的东西,不要问太多的为什么。
你可以做一个试验,把模式对话框的创建
放到应用程序初始化的那个函数中,你就
会发现早在程序的message queue创建之前
这个模式对话框就可以处理消息了,这个
能力显然是他自己带的。至于微软为什么
要这样实现,who knows.
hfyhl
驱动小牛
驱动小牛
  • 注册日期2002-11-08
  • 最后登录2005-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-03 14:20
另外一个事实是
在纯用api编windows程序的应用中
你必须为每一个窗口注册消息处理函数
这样也就可以理解为什么对话框
自己会带一个消息循环了

VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-03 14:26
另外一个事实是
在纯用api编windows程序的应用中
你必须为每一个窗口注册消息处理函数
这样也就可以理解为什么对话框
自己会带一个消息循环了

 

用DialogBoxIndirect创建的对话框,也可以有消息函数,它一出来就是模式(阻塞)的,不像CreateDialogIndirect那样需要自己处理消息阻塞
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
hfyhl
驱动小牛
驱动小牛
  • 注册日期2002-11-08
  • 最后登录2005-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-03 14:30
用哪个函数来创建对话框不是关键
他们只是途径和使用的资源不同而已
escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-03 14:37
pop出一个模式对话框,不就是在一个消息处理函数中做的么?
如果模式对话框还没有结束,对于单线程的程序来说,其他函数
就不可能被调用了。
所以了,对话框就只好自己处理消息了。
也不知偶得理解对不对?
hfyhl
驱动小牛
驱动小牛
  • 注册日期2002-11-08
  • 最后登录2005-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-03 14:58
你可以这样理解,但这肯定不是
微软采用这种办法的原因。我也
想过这个问题,既然可以有消息
泵将程序的消息分发给视图,框架,
文档(实际上文档只接受命令),
那肯定也可以让他把消息发给子
窗口,微软没有这样做,我猜是应为
这样多了一道工序,而不如直接
处理来的简洁,而视图,框架,文档
就不同了,因为他们本身是程序框架
的一部分,每个程序都会有,因此
不会增加额外开销。
不过,这仅仅是我的猜想而已。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-03 17:53
用哪个函数来创建对话框不是关键
他们只是途径和使用的资源不同而已
 

不很一样
DialogBoxIndirect创建的是模式对话框,天生就是阻塞的,不必自己死循环阻塞
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
deltali
驱动小牛
驱动小牛
  • 注册日期2002-10-25
  • 最后登录2010-07-06
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望23点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
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.
我又来了,生命不息,驱动不止。
游客

返回顶部