winapi - sombras - que son las mascaras de capas en photoshop
Win32: ¿Cómo hacer sombra paralela no rectangular ventana en capas? (3)
¿Por qué no usa LWA_ALPHA y crea la sombra en la imagen?
Edite en respuesta a su comentario:
A) No te detiene utilizando un PNG canalizado alfa solo para una sombra. Blt las 2 imágenes juntas y utilícelas como una sola imagen.
B) No es difícil generar una sombra paralela. En la imagen que publicó su negro con 3 valores alfa diferentes.
C) Pero no funciona, ¿verdad? es decir, tiempo para ser creativo.
D) Entonces no intentes hacer que Windows haga algo que no hará por ti.
E) es completamente irrelevante. Las ventanas en capas lo manejan por usted.
Te recomiendo que aprendas más sobre las ventanas en capas porque PUEDEN ayudarte a alcanzar tu objetivo.
Edit2: tienes el mapa de bits. Es bastante fácil escanear sobre la imagen y encontrar qué bits serán coloreados (identificando el negro por ti mismo) y cambiar eso para tener un alfa de 0 donde todo lo demás tendrá un alfa de 255 (No: puede que tengas que convertir la imagen a una imagen de 32 bits de un formato de color inferior, puede hacer esto creando un nuevo DC y copiando la imagen). Esto le dará el mismo efecto con LWA_ALPHA que con LWA_COLORKEY. A partir de ahí es bastante fácil identificar el píxel en el borde, donde el color cambia a (R = 0, G = 0, B = 0, A = 0). A continuación, cambia el primer píxel para tener un alfa de 192, el golpe a 128 y el de abajo a 64. Ahora tienes una gradación alfa debajo de la imagen que se verá como la sombra. Puede ajustar el alfa para obtener el efecto que desea.
Creé una ventana en capas agregando el estilo extendido WS_EX_LAYERED :
wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;
Windows usará negro como valor de color de clave de croma. Voy a dejar un borde grande de negro para que el problema sea obvio:
texto alternativo http://i45.tinypic.com/2qs002q.jpg
Después de que se construye la ventana, le digo que use negro como color de chroma key :
SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY);
Ahora la ventana emergente en capas aparece parcialmente transparente:
texto alternativo http://i48.tinypic.com/2cfta3o.jpg
El problema es el paso final. Quiero usar el estilo de clase CS_DROPSHADOW , disponible desde Windows XP, para crear una sombra paralela :
wndClass.Style = wndClass.Style | CS_DROPSHADOW;
Aparece la sombra paralela, pero la sombra rodea la ventana rectangular original y no tiene en cuenta la transparencia de la ventana proporcionada por la ventana en capas:
http://i49.tinypic.com/23lnnu9.jpg
¿Alguien sabe qué opción mágica me he perdido en algún lugar que hará que la sombra paralela honre a la ventana en capas no rectangular?
Otro ejemplo de dónde aparece este problema es cuando no incluye el relleno / margen de 6px. La ventana de sugerencia dibujada por los temas de Windows® no es rectangular. Esto deja un pequeño espacio visible donde la ventana es transparente, pero la sombra paralela no aparece:
texto alternativo http://i47.tinypic.com/30arsxk.png
Microsoft ha logrado que funcione, como puede ver en esta sugerencia de Internet Explorer:
texto alternativo http://i46.tinypic.com/f104cj.jpg
Mirando más de cerca en una ventana de sugerencia de clase de sugerencias de Windows. Usando SpyXX - puedo obtener su ventana rect y estilos de clase:
http://i49.tinypic.com/f4pued.jpg
SpyXX dice:
Rectangle: (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect: (0, 0)-(104, 20), 104x20
De modo que todo apunta a que la ventana tiene 104x20 píxeles, con la sombra paralela fuera de la ventana. (Lo cual es consistente con CS_DROPSHADOW
).
A continuación, puedo ver los estilos de la clase de ventana de información sobre tooltips
:
Windows Styles: 94000001
WS_POPUP 80000000
WS_VISIBLE 10000000
WS_CLIPSIBLINGS 4000000
TTS_ALWAYSTIP 1
Extended Styles: 00080088
WS_EX_LAYERED 80000
WS_EX_TOOLWIN 80
WS_EX_TOPMOST 8
Curiosamente, no usa CS_SAVEBITS
( CS_SAVEBITS
); que es útil para ventanas pequeñas y de corta vida.
Tampoco usa CS_DROPSHADOW
( 0x20000
). Entonces, ahora me pregunto cómo está dibujando fuera de su propia ventana.
Nota: Las ventanas en capas transparentes están documentadas como la técnica preferida sobre las regiones.
Editar: Windows con capas ha existido con Windows 2000. CS_DropShadow se agregó con XP.
CS_DROPSHADOW
solo funciona con ventanas rectangulares estándar. WS_EX_LAYERED
ventanas WS_EX_LAYERED
no admiten todo. Son más un método de autoservicio de bajo nivel para dibujar exactamente lo que desea.
Para obtener una sombra paralela, deberá generar la sombra paralela desde el canal alfa de la imagen.
Las ventanas transparentes en capas están documentadas como la técnica preferida sobre las regiones.
Sin embargo, CS_DROPSHADOW
presta atención a las regiones. Si recorta o da forma a su ventana usando una región, la sombra paralela seguirá el nuevo esquema.
Afortunadamente, puede usar regiones con ventanas en capas, y al combinar las dos obtiene el efecto que está buscando.
Por cierto: tooltips_class32 usa CS_DROPSHADOW; no lo verás en los estilos de ventana porque es un estilo de clase, no un estilo de ventana.