Invalidate () сообщение об ошибке подтверждения отладки (MFC, VC ++) - PullRequest
0 голосов
/ 21 апреля 2010

Я сделал пользовательский элемент управления, и когда я хочу перекрасить его на экране, я вызываю Invalidate (), а затем UpdateWindow (), но я получаю сообщение:

Ошибка отладки для файла afxwin2.inl в строке 150, а именно:

AFXWIN_INLINE void CWnd::Invalidate(BOOL bErase)

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

Дело в том, что когда я запускаю одно и то же приложение в режиме выпуска, оно не сообщает ни о каком сообщении! Так что эта подсказка заставляет меня думать, что нужно изменить конфигурацию среды.

Что ты думаешь?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 21 апреля 2010

Ну

ASSERT(::IsWindow(m_hWnd));

является утверждением. Утверждения - это утверждения, которые подтверждают, что что-то верно, и убивают вашу программу, если это не так. Они предназначены для использования для отладки и разработки, а не для того, чтобы быть в программе после ее выпуска, поэтому они обычно компилируются только в отладочных сборках. Таким образом, его не будет в сборке релиза, и вы не получите сообщение об ошибке. Это не означает, что в сборке релиза нет проблем. Это просто означает, что он не выполняет оператор, чтобы проверить, есть ли проблема.

Я не знаю много об этой ошибке, но, глядя на нее,

::IsWindow(m_hWnd)

явно ложно (отсюда и сообщение об ошибке). Может показаться, что документация для IsWindow () указывает на то, что проблема в том, что рассматриваемый дескриптор окна не является дескриптором действительного окна. Возможно, он не был создан должным образом или уже уничтожен. Вы должны выяснить, почему ваш дескриптор окна недействителен.

Быстрый поиск в Google по запросу "mfc iswindow" вызывает эту ветку на msdn, которая может вам помочь.

2 голосов
/ 21 апреля 2010

Вы вызываете Invalidate перед созданием окна или после разрушения окна. Быстрое исправление заключается в проверке :: IsWindow (m_hWnd) перед вызовом Invalidate. Чтобы действительно исправить эту ошибку, выясните, почему Invalidate вызывается, когда окно не существует. Например, попытка аннулировать окно из его конструктора вызывает это утверждение.

0 голосов
/ 27 июля 2015

Вы вызвали Invalidate () для класса, производного от CWnd, но член m_hWnd этого окна еще не создан. Сначала вы должны вызвать метод Create (или CreateEx), чтобы построить его (или использовать метод, который делает все это за вас, например, DoModal ()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...