环境VC2008,在文档视图结构中的菜单上加了菜单用于弹出一个派生自CDialog的对话框,响应加到了frame窗口中。 在OnInitDialog中使用SetTimer设置定时器,采用默认响应函数OnTimer。 问题: 1、在菜单的响应函数中使用对话框的DoModal弹出,定时器没有响应,SetTimer的返回值正常,在对话框的PreTranslateMessage函数中发现根本就收不到WM_TIMER消息。 2、将对话框使用Create,ShowWindow的形式创建非模态对话框就可以收到WM_TIMER消息,能够进入到OnTimer中。 百思不得其解!哪位给解释一下,找一下原因??多谢,多谢~~
6个回复
当使用DoModal形式创建模态对话框的时候,你所弹出的对话框和主程序处于同一个线程内,并且一旦弹出模态对话框,线程就处于堵塞(停顿)状态,在此期间无法响应其它操作,直到模态对话框销毁。 而用非模态对话框的话,实际上等于开辟了一个新的子线程,你的主程序(就是那个frme)和对话框各跑各的,自然可以响应定时器事件。
学习了,以前这点真没注意,也很少用定时器
当使用DoModal形式创建模态对话框的时候,你所弹出的对话框和主程序处于同一个线程内,并且一旦弹出模态对话框,线程就处于堵塞(停顿)状态,在此期间无法响应其它操作,直到模态对话框销毁。 而用非模态对话框的话,实际上等于开辟了一个新的子线程,你的主程序(就是那个frme)和对话框各跑各的,自然可以响应定时器事件。
并且一旦弹出模态对话框,线程就处于堵塞(停顿)状态,?? OnInitDialog时,还没弹出对话框吧?
当使用DoModal形式创建模态对话框的时候,你所弹出的对话框和主程序处于同一个线程内,并且一旦弹出模态对话框,线程就处于堵塞(停顿)状态,在此期间无法响应其它操作,直到模态对话框销毁。 而用非模态对话框的话,实际上等于开辟了一个新的子线程,你的主程序(就是那个frme)和对话框各跑各的,自然可以响应定时器事件。
不是你说的那样,我是在对话框中设置的定时器,不是在主程序里,在对话框中加的响应函数OnTimer
引用 1 楼 rxguoblp 的回复: 当使用DoModal形式创建模态对话框的时候,你所弹出的对话框和主程序处于同一个线程内,并且一旦弹出模态对话框,线程就处于堵塞(停顿)状态,在此期间无法响应其它操作,直到模态对话框销毁。 而用非模态对话框的话,实际上等于开辟了一个新的子线程,你的主程序(就是那个frme)和对话框各跑各的,自然可以响应定时器事件。 并且一旦弹出模态对话框,线程就处于堵……
上面的那位说的不太对,模态对话框和非模块对话框都是创建的新线程,因为CDialog是从CThread继承的,都是开辟的UI线程。弹出模态对话框之后,主程序就不响应了那倒是真的。