我已经制作了一个自定义控件,当我希望它在屏幕上重新绘制时,我调用Invalidate(),然后调用UpdateWindow(),但是我收到消息:
对于第150行中的文件afxwin2.inl,debug assertion failed:
AFXWIN_INLINE void CWnd::Invalidate(BOOL bErase)
{ ASSERT(::IsWindow(m_hWnd)); ::InvalidateRect(m_hWnd, NULL, bErase); }
问题是,当我在发布模式下运行相同的应用程序时,它不会报告任何消息!所以这个线索让我觉得我应该改变一些环境配置。
您怎么看?
感谢。
答案 0 :(得分:6)
那么,
ASSERT(::IsWindow(m_hWnd));
是一个断言。断言是证明某些事情是真实的陈述,如果不是,就会杀死你的程序。它们旨在用于调试和开发,而不是在程序发布后进入程序,因此它们通常仅在调试版本中编译。因此,它不会出现在发布版本中,并且您不会收到错误消息。这并不意味着发布版本中没有问题。它只是意味着它没有运行语句来检查是否存在问题。
我对这个错误知之甚少,但看着它,
::IsWindow(m_hWnd)
显然是错误的(因此错误消息)。 The documentation for IsWindow()似乎表明问题在于所讨论的窗口句柄不是有效窗口的句柄。也许它没有被正确创建,或者它已经被破坏了。你必须弄清楚你的窗口句柄无效的原因。
快速谷歌搜索“mfc iswindow”会在msdn上显示this thread,这可能会对你有所帮助。
答案 1 :(得分:2)
在创建窗口之前或窗口被销毁之后调用Invalidate。快速修复是在Invalidate调用之前测试:: IsWindow(m_hWnd)。要真正解决此错误,请找到当窗口不存在时调用Invalidate的原因。例如,尝试使窗口从其构造函数中失效会导致此断言。
答案 2 :(得分:0)
您已在CWnd派生类上调用了Invalidate(),但该窗口的m_hWnd成员尚未构建。您应首先调用Create(或CreateEx)方法,以便构建它(或使用为您完成所有这些操作的方法,如DoModal())。