Видео и окно поверх окна

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 2 сен 2010.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Привет.

    Есть окно, поверх которого я рисую видео. Видео рисуется следующим образом: есть очередь кадров. Когда пришло время показать кадр N, я делаю окну InvalidateRect(0, 0), а окно, по WM_PAINT через D3D отрисовывает квад с текстурой (во-первых - все ли тут хорошо?).

    Проблема в том, что когда я таскаю другое окно поверх видео (с опцией винды "показывать содержимое окна при перетаскивании"), то окно с видео не перерисовывается - последний кадр замирает, а таскаемое окно оставляет след. То есть картинка не обновляется. Видео продолжает бежать спустя некоторую долю секунды после того как я отпускаю таскаемое окно.

    Все ли я правильно сделал, и как сделать так чтобы видео продолжало бежать при таскании окна поверх него?
     
  2. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    Мб поможет - кубик на GDI все перерисовывается
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Treant

    Боже, ассемблер :))) Кстати так делать цикл обработки сообщений не правильно - посмотри какую загрузку процессора создает твое окно. Да и отрисовка не правильная - где BeginPaint, EndPaint? У тебя обработчик WM_PAINT провоцирует отправку окну WM_PAINT, что совсем не правильно.

    Я вот думаю может надо как-то по-особому WM_ERASEBKGRND похендлить?
     
  4. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    BitBlt когда вызывается?
     
  5. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    Привет.
    _DEN_ вот ты говориш что генериш WM_PAINT и ловиш его в оконной процедуре там вызываеш D3D и рисуеш а трейсил код ? например непонятно в момент когда это происходит странное поведение сообщения WM_PAINT продолжают приходить ? функции D3D продолжают вызыватся ? очень помогает обильный трейс проблемного участка )))
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    osox

    Поскольку окно с видео является частью оконной системы, и сама оконная система не залипает, то я делаю вывод что как минимум не залипает и обработчик WM_PAINT моего окна с видео. Сегодня попробую поковыряться более детально.
     
  7. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Обычно это делается примерно так:

    Код (Text):
    1. OnPaint(HWND hWnd)
    2. {
    3.     HDC hDC = BeginPaint(hWnd, &ps);
    4.     Paint(hDC);
    5.     EndPaint(hWnd, &ps);
    6. }
    7.  
    8. OnNewFrame(HWND hWnd)
    9. {
    10.     HDC hDC = GetDC(hWnd);
    11.     Paint(hDC);
    12.     ReleaseDC(hWnd, hDC);
    13. }
    По поводу проблемы: WM_PAINT имеет низкий приоритет и приходит когда нет других сообщений, возможно дело в этом. Как ведут себя другие проигрыватели?
    WM_ERASEBAKGRND в данном случае обрабатывать вообще не нужно. Его нужно обрабатывать если вывод идёт в некоторую часть окна, а оставшуюся область нужно залить каким-то цветом/шаблоном.
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    А это заблуждение. Одно окно может спокойно висеть, пока остальные полноценно функционировать.
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Я о том что обработчик не висит в каком-либо блокирущем вызове, пока я таскаю окно. Поток и очередь сообщений одна, поэтому если бы зависло в обработчике, зависла бы и вся очередь.
     
  10. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    посмотри через какой нить перехватчик сообщений, например мелкософтский что тебе приходит во время перетаскивания поверх твоего окна, использовать d3d с WM_PAINT неправильно, нужен таймер, и желательно хорошего разрешения, что бы всегда отрисовываться