Проблема с рисованием: ShowWindow(hWnd, SW_HIDE) автоматически делает прямоугольники недействительными?

Я столкнулся с проблемой, когда у меня есть окно, содержащее дочернее окно. Дочернее окно содержит другое дочернее окно, в котором видео воспроизводится с помощью проигрывателя Windows Media. Всякий раз, когда я вызываю ShowWindow (hWnd, SW_HIDE) в родительском окне и закрашиваю всю поверхность, область, занятая дочерним окном (где воспроизводилось видео), не переопределяется. Я использовал spy++ и обнаружил, что область, которая не была переопределена, была скрыта ДО того, как произошла перерисовка.

Я отслеживал hwnd дочернего окна, и, похоже, оно не получало сообщений WM_EraseBKGND или WM_NCPAINT. Означает ли это, что площадь, которую он занимал, не была признана недействительной и, следовательно, не могла быть перерисована? Я новичок в винформс.

Спасибо!


person wk1989    schedule 14.04.2010    source источник
comment
Видеоокно, вероятно, использует такую ​​технологию, как DirectX, которая обходит обычный Windows API для обновления экрана. К сожалению, я не знаю, как вам помочь - я ожидаю, что дочернее окно обнаружит, что оно было скрыто, и автоматически отключит внука.   -  person Mark Ransom    schedule 14.04.2010
comment
После некоторого расследования я решил, что проблема заключается в DirectX, я отключил композицию рабочего стола (я использую Vista), и эта проблема не возникает. Также, если я скрою окно во время воспроизведения видео (вместо остановки и скрытия) проблемы также не возникает.   -  person wk1989    schedule 14.04.2010
comment
Проблема, по-видимому, связана с видеорендерером EVR в Vista: область, которую он занимает, кажется, не закрашивается, если рендеринг видео остановлен.   -  person wk1989    schedule 16.04.2010


Ответы (1)


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

Используйте метод Invalidate(), чтобы заставить окна перерисовываться. По возможности избегайте P/вызова ShowWindow(), свойство Visible всегда является хорошей альтернативой.

person Hans Passant    schedule 14.04.2010