模态对话框使用OnOK结束时,ASSERT(ContinueModal())断言处报错
2010-07-02 16:59
411 查看
BOOL CWnd::ContinueModal() { return m_nFlags & WF_CONTINUEMODAL; }
从源代码可以看出,报错的原因是对话框没有了WF_CONTINUEMODAL属性,模态对话框默认是有这个属性的,再看看是哪个地方去掉了这个属性呢?
再看下面几段源代码:
void CDialog::OnCancel() { EndDialog(IDCANCEL); } void CDialog::EndDialog(int nResult) { ASSERT(::IsWindow(m_hWnd)); if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL)) EndModalLoop(nResult); ::EndDialog(m_hWnd, nResult); } void CWnd::EndModalLoop(int nResult) { ASSERT(::IsWindow(m_hWnd)); // this result will be returned from CWnd::RunModalLoop m_nModalResult = nResult; // make sure a message goes through to exit the modal loop if (m_nFlags & WF_CONTINUEMODAL) { m_nFlags &= ~WF_CONTINUEMODAL; PostMessage(WM_NULL); } }
原来是在EndModalLoop里去掉的。这个函数里除了去掉了这个属性,似乎没有做其它什么“有用”的操作,那就直接放弃它,直接用::EndDialog(m_hWnd, nResult);来结束对话框吧
于是在对话框调用OnCancel的地方,换成::EndDialog(m_hWnd, nResult),试了下,暂时还没发现问题
2010年7月9日 15:09:36
edit
果然发现问题了,在调用前,还要加上这句
m_nFlags &= ~WF_CONTINUEMODAL;
要不然,会卡在对话框的消息循环里退不出来
但是这样做了,偶尔还会出现ASSERT(ContinueModal())断言处报错的现象,暂时不知道为什么。
相关文章推荐
- JUnit中使用Hamcrest测试框架的assertThat断言【4.4新特性】
- java使用assert断言时不起作用的解决办法
- GetDlgItem使用时出现ASSERT断言或报错
- 使用junit Assert 断言来判断参数是否为空
- 关于ASSERT(断言)使用的规则--摘自《高质量C/C++编程指南》
- 线程池创建及使用案例及调试函数assert()断言调试介绍
- gcc 中 assert(断言)的使用
- Java断言(assert)介绍及使用
- JUnit4中使用Hamcrest测试框架的assertThat断言 小实例
- iOS开发65-ASSERT(0)断言在iOS开发中的使用
- C++ Assert()断言机制原理以及使用方法
- java 断言 assert 初步使用:断言开启、断言使用
- 习惯使用断言Assert
- java 断言 assert 初步使用:断言开启、断言使用
- java 中的断言assert的使用
- 学习使用TestNG中的断言(Assertion) (1) ——Assertion概述与assertEquals方法简介
- assert断言函数的使用
- 断言Assert的使用
- java 断言 assert 初步使用:断言开启、断言使用
- 使用断言NSAssert()和NSParameterAssert调试程序错误