簡體   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