[英]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.