Pregunta

Me gustaría crear una ventana de nivel superior (es decir, no ws_child) con transparencia. Sin embargo, no quiero que sea una máscara simple, donde un píxel dado es completamente transparente o completamente opaco. Y no quiero que sea tal que toda la ventana tenga un nivel alfa. Más bien, me gustaría que la ventana sea esencialmente completamente transparente, con un mapa de bits dibujado con un canal alfa, de modo que el mapa de bits se mezcle con cualquier ventana que esté detrás de él. Imagen, digamos, un resumen de sol, donde el alfa de una imagen se combina de opaco a completamente transparente hacia afuera desde el centro.

He encontrado dos métodos que se acercan a lo que quiero hacer, pero no del todo. Usando regiones, puedo cortar una sección que se dibuja completamente transparente. Usando ventanas en capas, también puedo hacer algo similar (o incluso puedo hacer que toda la ventana sea ligeramente transparente, pero eso no es lo que quiero en absoluto). He examinado otros estilos, como WS_EX_TRANSPARENT y WS_EX_COMPOIE, pero fue en vano.

Puedo hacer que este tipo de efecto funcione bien en las ventanas infantiles, ya que se están mezclando con las ventanas de sus padres dentro de la región de sus padres. Hacer que funcione de manera similar para las ventanas de nivel superior continúa eludiendo.

Sé que esto se puede hacer, ya que la gente me ha asegurado que lo han visto en otros programas. Siento que no estoy entendiendo completamente algo simple aquí sobre pintar ventanas.

¿Fue útil?

Solución

Ventanas en capas (WS_EX_LAYERED) debe hacer el trabajo, teniendo en cuenta que debe usar UpdateLayeredWindow() y un formato de mapa de bits algo inusual (alfa pre-multiplicado de 32 bits) para especificar valores alfa por píxel (SetLayeredWindowAttributes() solo le permitirá especificar un solo valor alfa para toda la ventana o tecla de color).

Dices que ya lo has probado, ¿qué problemas experimentaste?

Otros consejos

La única forma que conozco para obtener alfa por píxel en una ventana es UpdateLayerDwindow ().
Mira este enlace MSDN: http://msdn.microsoft.com/en-us/library/ms997507.aspx

Tenga en cuenta que al usar UpdateTelayerDwindow, la aplicación no necesita responder a WM_Paint u otros mensajes de pintura, porque ya ha proporcionado la representación visual para la ventana y el sistema se encargará de almacenar esa imagen, componerla y hacerla en el pantalla. UpdateLayerDwindow es bastante poderoso, pero a menudo requiere modificar la forma en que se dibuja una aplicación Win32 existente.

Apuesto a que estos son los problemas que estaba experimentando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top