Привет. Есть окно, поверх которого я рисую видео. Видео рисуется следующим образом: есть очередь кадров. Когда пришло время показать кадр N, я делаю окну InvalidateRect(0, 0), а окно, по WM_PAINT через D3D отрисовывает квад с текстурой (во-первых - все ли тут хорошо?). Проблема в том, что когда я таскаю другое окно поверх видео (с опцией винды "показывать содержимое окна при перетаскивании"), то окно с видео не перерисовывается - последний кадр замирает, а таскаемое окно оставляет след. То есть картинка не обновляется. Видео продолжает бежать спустя некоторую долю секунды после того как я отпускаю таскаемое окно. Все ли я правильно сделал, и как сделать так чтобы видео продолжало бежать при таскании окна поверх него?
Treant Боже, ассемблер )) Кстати так делать цикл обработки сообщений не правильно - посмотри какую загрузку процессора создает твое окно. Да и отрисовка не правильная - где BeginPaint, EndPaint? У тебя обработчик WM_PAINT провоцирует отправку окну WM_PAINT, что совсем не правильно. Я вот думаю может надо как-то по-особому WM_ERASEBKGRND похендлить?
Привет. _DEN_ вот ты говориш что генериш WM_PAINT и ловиш его в оконной процедуре там вызываеш D3D и рисуеш а трейсил код ? например непонятно в момент когда это происходит странное поведение сообщения WM_PAINT продолжают приходить ? функции D3D продолжают вызыватся ? очень помогает обильный трейс проблемного участка )))
osox Поскольку окно с видео является частью оконной системы, и сама оконная система не залипает, то я делаю вывод что как минимум не залипает и обработчик WM_PAINT моего окна с видео. Сегодня попробую поковыряться более детально.
Обычно это делается примерно так: Код (Text): OnPaint(HWND hWnd) { HDC hDC = BeginPaint(hWnd, &ps); Paint(hDC); EndPaint(hWnd, &ps); } OnNewFrame(HWND hWnd) { HDC hDC = GetDC(hWnd); Paint(hDC); ReleaseDC(hWnd, hDC); } По поводу проблемы: WM_PAINT имеет низкий приоритет и приходит когда нет других сообщений, возможно дело в этом. Как ведут себя другие проигрыватели? WM_ERASEBAKGRND в данном случае обрабатывать вообще не нужно. Его нужно обрабатывать если вывод идёт в некоторую часть окна, а оставшуюся область нужно залить каким-то цветом/шаблоном.
Я о том что обработчик не висит в каком-либо блокирущем вызове, пока я таскаю окно. Поток и очередь сообщений одна, поэтому если бы зависло в обработчике, зависла бы и вся очередь.
посмотри через какой нить перехватчик сообщений, например мелкософтский что тебе приходит во время перетаскивания поверх твоего окна, использовать d3d с WM_PAINT неправильно, нужен таймер, и желательно хорошего разрешения, что бы всегда отрисовываться