Como faço para obter uma caixa de diálogo Windows transparente e as primitivas de desenho para permanecer na parte superior de uma janela que está desenhando vídeo de streaming?

StackOverflow https://stackoverflow.com/questions/2180125

Pergunta

Eu tenho um controle ActiveX que contém uma janela que tem o streaming de vídeo sendo desenhado por ele. Eu tenho um diálogo separado que eu crio em outra janela que fiz transparente ou semi-transparente de várias maneiras (ou seja, usando os setleredwindowattributes (...) junto com a propriedade em camadas [para a mistura alfa] do diálogo ou a configuração do transparente propriedade).

Além disso, tentei usar vários métodos para tentar obter a janela para que a caixa de diálogo sempre desenhasse na janela de vídeo de streaming, mas nenhuma provou funcionar para mim. Se eu tiver um botão na caixa de diálogo ou desenhar na superfície transparente com chamadas de lineto (...), elas não permanecem no topo do vídeo. Tentei usar o setWindowPOS para afetar a ordem Z das duas janelas e também tentei alterar as propriedades da janela de diálogo, como "o topo mais", mas sem sucesso.

Alguém já tentou fazer algo assim para uma janela sobreposta durante o streaming de vídeo e conseguiu que a ordem Z trabalhasse para pintar a janela da frente sempre após o vídeo de streaming?

ATUALIZAÇÃO: 02/10/10 - Tentei usar a propriedade WS_EX_LAYERED com setLayeredWindowAttributes (...) usando LWA_COLORKEY e alcançou o que estava procurando. Como a propriedade em camadas não pode ser usada com o estilo WS_CHILD, essa solução traz consigo algum gerenciamento necessário da posição da janela de sobreposição em relação à janela com vídeo. Além disso, existem outras esquisitices que estou tentando eliminar. Por exemplo, quando a janela de controle do ActiveX com vídeo é incorporada em uma guia IE e eu alterno para outro controle da guia na janela de sobreposição permanece no topo da nova guia (quando o estilo WS_POPUP usado). Ainda investigando se haverá meios alternativos de lidar com isso, determinar o interruptor e ocultar a visibilidade da janela.

Foi útil?

Solução 2

Propriedade ws_ex_layered com setLayeredwindowattributes (...) usando LWA_COLORKEY alcançará a transparência onde o ColorKey é usado. A sobreposição transpaerente permanece na frente do vídeo e o vídeo de streaming ativo permanece ao vivo. O estilo WS_CHILD não pode ser usado com estilo em camadas e, portanto, a posição da janela requer gerenciamento adicional se o WS_POPUP for usado. Questões adicionais podem surgir da incapacidade de se sobrepor como uma janela infantil. -See q atualização.

Outras dicas

Isso pode não ser possível, muito código de saída de vídeo utiliza sobreposições de hardware; portanto, se sua janela estiver na frente, a sobreposição não funcionará ou não desenhará onde estão seus pixels.

As sobreposições de hardware permitem que o código de desenho de vídeo apresente quadros em um formato diferente do formato de exibição atual, que pode salvar muita CPU e largura de banda de memória.

Na minha experiência, a sobreposição geralmente está no formato YUV, em vez de RGB, porque muitos formatos de compressão de vídeo são baseados no YUV. Portanto, o hardware de vídeo é obter alguns pixels de uma imagem YUV e não do buffer de tela, para que você não possa afetar esses pixels, a menos que se inserisse no caminho do código de renderização do fluxo de vídeo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top