繁体   English   中英

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

[英]Invalidate() debug assertion failed message (MFC, VC++)

我做了一个自定义控件,当我想让它在屏幕上重新绘制时,我调用了Invalidate(),然后调用了UpdateWindow(),但是我得到了消息:

第150行中的文件axxwin2.inl的调试断言失败:

AFXWIN_INLINE void CWnd::Invalidate(BOOL bErase)

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

问题是,当我在发布模式下运行同一应用程序时,它不会报告任何消息! 因此,这个线索使我认为这是我应该更改的某些环境配置。

你怎么看?

谢谢。

好,

ASSERT(::IsWindow(m_hWnd));

是一个断言。 断言是用于验证某些内容正确的语句,否则将杀死您的程序。 它们旨在用于调试和开发,而不是一旦发布就可用于程序中,因此它们通常仅在调试版本中进行编译。 因此,它不会在发布版本中存在,并且您不会收到错误消息。 这并不意味着发行版本中没有问题。 这只是意味着它没有运行语句来检查是否存在问题。

我对所涉及的错误了解不多,但是看着它,

::IsWindow(m_hWnd)

显然是错误的(因此出现错误信息)。 IsWindow()的文档似乎表明该问题是所讨论的窗口句柄不是有效窗口的句柄。 可能尚未正确创建,或者已被销毁。 您必须弄清楚为什么窗口句柄无效。

谷歌快速搜索“ mfc iswindow”会在msdn上显示该线程 ,可能对您有帮助。

您可以在创建窗口之前或销毁窗口之后调用Invalidate。 快速解决方案是在Invalidate调用之前测试:: IsWindow(m_hWnd)。 要真正修复此错误,请查找为什么在不存在窗口时调用Invalidate的原因。 例如,尝试从其构造函数中使窗口无效会导致此断言。

您已经在CWnd派生的类上调用了Invalidate(),但是尚未构建该窗口的m_hWnd成员。 为了构建它,您应该首先调用Create(或CreateEx)方法(或使用为您完成所有工作的方法,如DoModal())。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM