Pergunta

Eu gostaria de criar uma janela de nível superior (ou seja, não ws_child) com transparência. No entanto, não quero que seja uma máscara simples, onde um determinado pixel é totalmente transparente ou totalmente opaco. E eu não quero que seja tal que toda a janela tenha algum nível alfa. Em vez disso, eu gostaria que a janela fosse essencialmente totalmente transparente, com um bitmap atraído por um canal alfa, de modo que o bitmap se misture com qualquer janela que possa estar por trás dele. Imagem, digamos, uma explosão de sol, onde o próprio alfa de uma imagem se mistura de opaca a para fora totalmente transparente do centro.

Eu encontrei dois métodos que ambos chegam perto do que quero fazer, mas não exatamente. Usando regiões, posso cortar uma seção que é atraída completamente transparente. Usando janelas em camadas, também posso fazer algo semelhante (ou pode até tornar toda a janela um pouco transparente, mas não é isso que eu quero). Eu olhei para outros estilos, como ws_ex_transparent e ws_ex_composite, mas sem sucesso.

Eu posso obter esse tipo de efeito para funcionar bem nas janelas infantis, pois elas estão se misturando com as janelas dos pais na região dos pais. Fazer funcionar da mesma forma para o Windows de nível superior continua a me iludir.

Eu sei que isso pode ser feito, pois as pessoas me garantiram que viram isso em outros programas. Sinto que não estou entendendo completamente algo simples aqui sobre pintar janelas.

Foi útil?

Solução

Janelas em camadas (WS_EX_LAYERED) deve fazer o trabalho, tendo em mente que você deve usar UpdateLayeredWindow() e um formato de bitmap um tanto incomum (alfa de 32 bits, pré-multiplicado) para especificar valores alfa por pixel (SetLayeredWindowAttributes() Permitirá que você especifique um único valor alfa para toda a janela ou tecla colorida).

Você diz que já tentou isso - que problemas você teve?

Outras dicas

A única maneira que eu conheço para obter alfa por pixel em uma janela é o UpdateLayeredWindow ().
Confira este link MSDN: http://msdn.microsoft.com/en-us/library/ms997507.aspx

Observe que, ao usar o UpdateLayeredWindow, o aplicativo não precisa responder a WM_Paint ou outras mensagens de pintura, porque já forneceu a representação visual para a janela e o sistema cuidará de armazenar essa imagem, compor -a e renderizá -la no tela. UpdateLayeredWindow é bastante poderoso, mas muitas vezes exige modificar a maneira como um aplicativo Win32 existente desenha.

Aposto que esses são os problemas que você estava enfrentando.

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