Диалог MFC исчезает после трудоемкого OnPaint () - PullRequest
1 голос
/ 04 марта 2012

В нашем приложении у нас есть диалоговое окно MFC, которое открывается и обрабатывает некоторые данные, необходимые для отображения. Следовательно, обработка инициируется лениво внутри события OnPaint (). Обработка занимает некоторое время (около 20-30 секунд) и является исключительно алгоритмическим (API-интерфейс не вызывается). Случается так, что иногда после завершения обработки окно «исчезает». Мы обнаружили, что он перенесен за родительское окно (основной кадр).

Вызов SetForegroundWindow () сразу после завершения обработки или выполнение обработки в потоке, не являющемся пользовательским интерфейсом (позволяющим OnPaint () завершиться в разумные сроки), устранило проблему.

Известна ли эта проблема? Есть ли определенный срок для выполнения OnPaint ()?

Спасибо

Alex.

1 Ответ

0 голосов
/ 10 марта 2012

http://msdn.microsoft.com/en-us/library/01c9aaty%28v=vs.80%29.aspx

Сообщение WM_PAINT отправляется при вызове функции-члена UpdateWindow или RedrawWindow.

Окно может получать внутренние сообщения рисования в результате вызова RedrawWindowфункция-член с установленным флагом RDW_INTERNALPAINT.В этом случае окно может не иметь области обновления.Приложение должно вызвать функцию-член GetUpdateRect, чтобы определить, имеет ли окно область обновления.Если GetUpdateRect возвращает 0, приложение не должно вызывать функции-члены BeginPaint и EndPaint.

Приложение обязано проверять любые необходимые внутренние перерисовки или обновления, просматривая свои внутренние структуры данных для каждого сообщения WM_PAINT, посколькуСообщение WM_PAINT могло быть вызвано как неверной областью, так и вызовом функции-члена RedrawWindow с установленным флагом RDW_INTERNALPAINT.

Внутреннее сообщение WM_PAINT отправляется Windows только один раз.После того как внутреннее сообщение WM_PAINT отправлено в окно с помощью функции-члена UpdateWindow, дальнейшие сообщения WM_PAINT не будут отправляться или отправляться до тех пор, пока окно не станет недействительным или пока функция-член RedrawWindow не будет вызвана снова с установленным флагом RDW_INTERNALPAINT.

...