Invalidate()调试断言失败消息(MFC,VC ++)

时间:2010-04-21 09:00:28

标签: c++ mfc visual-c++

我已经制作了一个自定义控件,当我希望它在屏幕上重新绘制时,我调用Invalidate(),然后调用UpdateWindow(),但是我收到消息:

对于第150行中的文件afxwin2.inl,

debug assertion failed:

AFXWIN_INLINE void CWnd::Invalidate(BOOL bErase)

    { ASSERT(::IsWindow(m_hWnd)); ::InvalidateRect(m_hWnd, NULL, bErase); }

问题是,当我在发布模式下运行相同的应用程序时,它不会报告任何消息!所以这个线索让我觉得我应该改变一些环境配置。

您怎么看?

感谢。

3 个答案:

答案 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())。