我需要打开一个从同一个类实例化两次的对话框。我试试这个时
CdelmeDlg dlg;
dlg.DoModal();
dlg.DoModal();
第二个调用仅在一瞬间打开对话框,然后关闭。我的赌注是消息队列中有剩余的消息,所以我在调用之间添加了这个消息
MSG msgCur;
while (::PeekMessage(&msgCur, NULL, NULL, NULL, PM_REMOVE))
;
这解决了这个问题,但感觉这是一种错误的事情。有没有办法正确处理剩余的消息?
答案 0 :(得分:1)
不要调用EndDialog(IDOK);
要处理按下的确定或取消按钮,只需继承OnOk或OnCancel ...否则将调用EndDialog两次,你将得到你遇到的问题!
答案 1 :(得分:1)
我实际上认为YeenFei在这里有一个好处。
我玩MFC已经有一段时间了(谢天谢地),但是从内存,计时器,可能会或可能不会从UI线程调用,具体取决于您使用的是哪一个。如果在主UI线程上引发计时器,则模式对话框可能会暂停主线程直到它被解除,之后它将被下一个计时器调用。如果在单独的线程上引发计时器,则对话框不会阻止主UI线程,因为它在单独的线程上显示。
似乎更可想象,因为YeenFei已经指出你想在每次提出计时器时重新显示你的对话框,当用户点击按钮解除它时隐藏它。这样,如果再次提高时间,它所做的就是重新显示对话框当前是否打开。
有一篇关于计时器和并发的好文章here (www.eggheadcafe.com),你可能会发现它很有趣,并且可能比我设法完成的事情更清晰。
答案 2 :(得分:1)
为什么你不能这样编码:
CdelmeDlg dlg;
dlg.DoModal();
CdelmeDlg dlg1;
dlg1.DoModal();
答案 3 :(得分:0)
如果您希望您的应用程序在没有UI的情况下在后台运行,为什么juz不能暂时隐藏它?一个简单的函数this-> ShowWindow(SW_HIDE)将为您完成这项工作。
我认为你应该修改你的设计决定,因为一个应用程序的行为似乎与你想要的一样不合逻辑。
答案 4 :(得分:0)
我通过隐藏对话框而不是关闭它并启动另一个首先休眠的线程然后取消隐藏对话框来解决问题。
答案 5 :(得分:0)
可能是你的代码有行:
m_pMainWnd = &dlg;
如果是这样,首次调用DoModal()之后的应用程序将完成,DoModal()的所有其他调用将返回-1。来自MSDN:
当m_pMainWnd引用的窗口关闭时,Microsoft基础类库将自动终止您的线程。如果此线程是应用程序的主线程,则应用程序也将终止。