2010-02-01 8 views
1

У меня есть элемент управления ActiveX, который содержит одно окно, на которое нарисовано потоковое видео. У меня есть отдельный диалог, который я создаю в другом окне, которое я сделал прозрачным или полупрозрачным по-разному (например, используя SetLayeredWindowAttributes (...) вместе со свойством Layered [для альфа-смешивания] диалога или установки прозрачного имущество).Как получить прозрачное диалоговое окно окна и примитивы рисования, чтобы оставаться поверх окна, которое создает потоковое видео?

Кроме того, я попытался использовать различные методы, чтобы попытаться заставить окно для диалога всегда рисовать поверх потокового видео окна, но никто не работал для меня. Если у меня есть кнопка в диалоговом окне или нарисована на прозрачной поверхности с помощью вызовов LineTo (...), они не остаются на вершине видео. Я попытался использовать SetWindowPos, чтобы повлиять на z-порядок двух окон, а также попытался изменить свойства диалогового окна, такие как «TopMost», но безрезультатно.

Кто-нибудь пытался сделать что-то подобное для наложенного окна поверх потокового видео и получил z-порядок для работы при рисовании переднего окна всегда после потокового видео?

UPDATE: 02/10/10 - попытался использовать свойство WS_EX_LAYERED с помощью SetLayeredWindowAttributes (...) с использованием LWA_COLORKEY и достиг того, что я искал. Поскольку многоуровневое свойство не может использоваться со стилем WS_CHILD, это решение приносит с собой некоторое необходимое управление оверлейным окном по отношению к окну с видео. Кроме того, есть некоторые другие странности, которые я пытаюсь устранить. Например, когда окно управления ActiveX с видео встроено в вкладку IE, и я переключусь на другие элементы управления вкладками в окне оверлея, оставайтесь наверху новой вкладки (когда используется стиль WS_POPUP). Тем не менее, выясняется, будут ли альтернативные способы решения этой проблемы, а затем определить переключатель и скрыть видимость окна.

ответ

0

Свойство WS_EX_LAYERED с помощью SetLayeredWindowAttributes (...) с использованием LWA_COLORKEY достигнет прозрачности, когда используется colorkey. Transpaerent overlay остается перед видео, а активное потоковое видео остается в режиме реального времени. Стиль WS_CHILD не может использоваться со слоистым стилем, поэтому для позиции окна требуется дополнительное управление, если используется WS_POPUP. Дополнительные проблемы могут возникнуть из-за невозможности наложения в качестве дочернего окна. -видите обновление Q.

0

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

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

По моему опыту, наложение обычно выполняется в формате YUV, а не в RGB, потому что многие форматы сжатия видео основаны на YUV. Таким образом, видеооборудование получает некоторые пиксели от изображения YUV и NOT из экранного буфера, поэтому вы не можете влиять на эти пиксели, если только вы не встанете на путь кода рендеринга видеопотока.

+0

Я использую среду мультимедиа (видео), другая группа разработчиков в моей компании разработана и предоставляет дескриптор окна для этого кода. Этот дескриптор используется их плагином рендеринга в конвейере, который использует Direct3d для рендеринга видео. У членов их пользовательского интерфейса есть другие приложения со слоем, постоянно находящимся поверх видео, но они используют QT (кросс-платформенное приложение и интерфейс пользовательского интерфейса). Они указали, что используют Qt :: FramelessWindowHint, который создает окно без полей, которое всегда остается поверх z-порядка. Если это можно сделать в Qt, это должно быть возможно в VC++. – flawlesslyfaulted

+1

Это не аппаратное наложение, вы можете игнорировать этот комментарий. –